算法之背包问题

背包问题(Knapsack problem)

背包问题是一种组合优化问题,为NP-C Problem

描述

给定一组物品,每个物体都有一定的价值和重量。
给定一个可容纳一定重量的背包,在限定容量内,如何选择物体,使得背包内物体价值总和最高。

解决思路

背包问题的经典解法思路是动态规划
遍历给定物体,当物体重量小于等于背包可容纳重量时,判断放入该物体和之前物体哪个带来价值最大,然后考虑是否置换物体。
状态转移方程

图片发自App

解题方程(python)

测试数据: 背包容量 c = 10 物品数量 n = 6 物体重量和价值为: w = [2,2,3,1,5,2] v = [2,3,1,5,4,3]

  1. 求包内可放入最大价值
def get_max_value(c,n,w,v):
    #Time O(cn)
    #Space O(cn)
    dp = [[0 for _ in range(c+1)] for _ in range(n+1)]
    for i in range(1,n+1):
        for j in range(1,c+1):
            dp[i][j] = dp[i-1][j]
            #状态转移方程
            if j >= w[i-1] and dp[i][j] < dp[i-1][j-w[i-1]] + v[i-1]:
                dp[i][j] = dp[i-1][j-w[i-1]] + v[i-1]
    return dp[-1][-1]
    
  1. To do:背包问题优化

参考资料

https://blog.csdn.net/qq_34178562/article/details/79959380

你可能感兴趣的:(算法之背包问题)