lougu P1048 采药 | 01背包

本文详细解析了背包问题中的动态规划算法,通过具体实例讲解如何求解最大价值,包括采药、装箱等多个问题场景。阐述了dp数组的含义及动态转移方程,介绍了滚动数组的优化方法。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值