01背包问题

动态规划的开端

给定一些物品的体积和价值,让求背包最多能装多少价值的东西。
需要三个数组,一个v[n]装i的体积,一个w[i]装i的价值
另外一个二维数组f[i][j]装在前i个物品,背包重量为j下能的最大价值

核心代码

for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j<v[i])
                f[i][j] = f[i-1][j];
            else
                f[i][j] = max(f[i-1][j], f[i-1][j-v[i]]+w[i]);
        }
    }

和分而治之差不多,
把问题分为多个部分,
即在每个承载量下的每个重量下,能装下,与不能装下所产生的最大价值

开始很难理解的一个东西,第一个循环控制装了前i个物品,第二个循环控制当前背包的重量为j.
如果不能装下, 那么目前的价值就等于i-1的价值。

如果能装下,还要分情况
就是把i-1的价值,与背包重量减去当前物品的重量后的价值加上当前物品的价值作比较,这样的话,当前背包的重量是固定不变的,也就是说,可以求出来m重量一下,每一个背包重量的最大价值,而不是单单求出来了重量为m的价值。 为什么要这么算,其实如果不这么算的话,到m的时候,没有f[i-1][j-v[i]]的值,因此需要一个个j迭代往上算。
最后这个f数组所代表的,就是在i个物品,背包重量为m下的最大价值.

能装下前一个的时候,把1-m背包重量下的情况列出来。
能装下前两个的时候,把1-m背包重量下的情况列出来。

能装下前n个时候,把1-m背包重量下的情况列出来。
层层递进,保证每个情况都是最优解,最后的答案也是最优解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值