lougu P1048 采药 | 01背包

有许多种物品,每种物品只有一个,求最大价值

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];
        }
    }
原文地址:https://www.cnblogs.com/QAQq/p/10300862.html