有许多种物品,每种物品只有一个,求最大价值
lougu P1048 采药
luogu P1049 装箱问题
luogu P1060 开心的金明
luogu P1164 小A点菜
dp[ i ] [ j ] 表示放前 i 个物品时,重量 j 能获得的最大价值
对于第 i 个物品,只有放与不放两种可能
如果放,那么重量 j 能获得的最大价值相当于前 i -1 个物品重量 j -w [ i ] 能获得的最大价值+ i 物品的价值
如果不放,那么重量 j 能获得的最大价值就是前 i -1 个物品重量 j 能获得的最大价值
两者取最大
动态转移方程为:dp[ i ] [ j ] = max(dp[ i -1 ] [ j -w [ i ] ] ) + v [ i ],dp[ i -1 ] [ j ])
由于 dp[ i ] [ j ] 的值只与它左上方与正上方的值有关,可以使用滚动数组,动态转移方程变为dp[ j ]=max( dp[ j ],dp[ j - w[ i ] ] + v[ i ] )
for(int i=0;i<m;i++) { for(int j=t;j>=w[i];j--) { if(dp[j]<dp[j-w[i]]+v[i]) dp[j]=dp[j-w[i]]+v[i]; } }