关于01背包问题的感悟

#01背包是如何实现的。

刚接触01背包问题时,所有人都会跟你说01背包的核心在于做出最优选择,新手对于这个最优选择可能有些云里雾里,
因为这个最优选择的判断是十分抽象的。但计算机本质上只能进行简单的加减乘除,以及简单的判断。

其实这个最优路径是有迹可循的。

下面先看一段最常见的01背包问题的代码

int V[N],W[N]; //V表示价值,W表示重量 N是一个足够大的数
cin>>n>>m;     //n表示有n个物品,m表示最大重量
for(int i=1;i<=n;i++). cin>>V[i]>>W[i];//输入每个物品的价值和重量

//下面开始正式处理01背包问题
for(int i=1;i<=n;i++)
   for(int j=0;j<=m;j++)
   {
       f[i][j]=f[i-1][j];
       if(j>=W[i]) 
          f[i][j]=max(f[i][j],f[i-1][j-W[i]]+V[i]); 
   }   

假设W={0,2,3,4,5}; V={0,3,4,5,6}
可以把这个二维数组想象成是一个表格,第0行先设定默认值为0
从第1行开始,j每次从0递增,当此时j小于最小那个物品的空间时,f[i][j]=f[i-1][j],相当于没取,直到j=2时,我们才能取到第一个物品,此时价值等于3,此后,因为i=1,所以后面的数只能不断取到V[1],所以第一行的数,在j=2之后,全为3.

到了下一行,此时开始有所不同,因为上一行的数不全为0,
比较的作用现在才开始显现。当j=3时,V=4,根据f[i-1][j-W[i]]+V[i]可知,V=0+4=4,往后递推,当f[i-1][j-W[i]]>0时,此时成为在原有价值上添加价值,由于i=2此时的价值还没有完全开发全面,这才有了后续的i=3,4…n,

总的来看,01背包问题是在一层一层摸索最省空间的最大价值,使选择最优解这个飘渺的问题实际化。

欢迎各位批评指正。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值