1.0-1背包问题
问题描述:有n件物品,每件商品的质量为w[i],价值为从c[i]。现有一个质量为V的背包,问如何选取物品放进背包,使得背包内物品的总价值最大。每种商品只有一件。
分析1:令dp[i][v]表示前i件商品恰好装入容量为v的背包中所能获得的最大价值。那么,对于第i件商品而言,它可以放入或者不放入。如果放入的话,问题就转化为前i-1件商品恰好装入容量为v-w[i]的背包中,所能获得的最大价值,此时dp[i][v]=dp[i-1][v-w[i]]+c[i]。如果不放的话,问题就转化为前i-1件商品恰好装入容量为v的背包中所能获得的最大价值,此时dp[i][v]=dp[i-1][v]。所以转移方程为dp[i][v]=max(dp[i-1][v-w[i]]+c[i],dp[i-1][v]),边界dp[0][v]=0,所以枚举i从1到n,v从0到V。
for(int i=1;i<=n;i++){ for(int v=w[i];v<=V;v++){ dp[i][v]=max(dp[i-1][v],dp[i-1][v-w[i]]+c[i]) } }