背包问题 (knapsack)是一种组合优化的NPC问题(Nondeterministic Problem Complete- 千禧难题之一)
NP问题:非确定多项式,但能在多项式时间内找到解
什么时候用背包:
什么时候用滚动数组:
dp[0][0 .... w] = 0, 表示0件物品装入背包最大价值为0
01 背包 01 knapsack:
N件物品,第i件重量为w[i],价值为v[i]。在总重量不超过W,求最大价值。
dp[i][j] = max(dp[i-1][j] (不选第i个背包), dp[i-1][j-w[i]] + v[i] (选第i个背包))
dp[0,...,W] = 0
for i = 1,...,N:
//必须逆向枚举,因为不能重叠
for j = W,...,w[i]:
dp[j] = max(dp[j], dp[j−w[i]]+v[i])
完全背包 unbounded knapsack:
N件物品,第i件重量为w[i],价值为v[i]。