博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6、0-1背包问题优化
阅读量:5102 次
发布时间:2019-06-13

本文共 1777 字,大约阅读时间需要 5 分钟。

0-1背包问题优化

关于0-1背包问题的优化,其实一开始也觉得分配的内存确实太多了,对于物品数为N,背包容量为W的背包问题
则我们每次需要分配的内存是N*W,这确实不太好。
于是我们是否可以使用一个一维数组来代替前面算法的二维数组问题呢?
 这好像是可以的,因为我们的想法是自底向上,其实对于W*N的二维数组,对于数组select[i][w]所代表的意思是
在背包容量为w,可以选的物品为前i个时它所能达到的最大价值,我们可以看到所记录的前面i个背包所能达到最
大的价值是浪费,我们所关心的只是在N个物品可选的情况下所能达到的最大价值。当然也是在容量可以W的可
选的情况下,,,,,,于是。。。。我们可以用一维数组表示啰。。。。因为有一维是浪费呢。。。。
 
  1. #include "oneZeroPackage_Optimize.h"
  2. int oneZeropkt_optimizeint(int pktVolum,int *prtVolum,int *prtValue,int prtLen){
  3. struct Goods_op *goods=new Goods_op[prtLen+1];
  4. for(int i=1;i<=prtLen; i++){
  5. goods[i].value=prtValue[i];
  6. goods[i].volum=prtVolum[i];
  7. }
  8. int *select=new int[pktVolum+1];
  9. for(int i=0;i<=pktVolum;i++){
  10. select[i]=0;
  11. }
  12. for(int i=1;i<=prtLen; i++){
  13. for(int w=pktVolum; w>=goods[i].volum; w--){
    //注意我们是在前一次的基础上进行这一次的计算
  14. select[w]=Max((select[w]),(select[w-goods[i].volum]+goods[i].value));
  15. }
  16. }
  17. return select[pktVolum];
  18. }
 
  1. #ifndef ONE_ZERO_PACKAGE_OPTIMIZE_H
  2. #define ONE_ZERO_PACKAGE_OPTIMIZE_H
  3. #define Max(a,b) a>b? a:b
  4. struct Goods_op{
  5. int value;
  6. int volum;
  7. };
  8. int oneZeropkt_optimizeint(int pktVolum,int *prtVolum,int *prtValue,int prtLen);
  9. #endif
 
  1. #include"oneZeroPackage.h"
  2. #include<iostream>
  3. #include"oneZeroPackage_Optimize.h"
  4. int main(){
  5. int prtValue[4]={
    0,6,10,12};
  6. int prtVolum[4]={
    0,1,2,3};
  7. //std::cout<<oneZeropkt(5,prtVolum,prtValue,3)<<std::endl;
  8. std::cout<<oneZeropkt_optimizeint(5,prtVolum,prtValue,3)<<std::endl;
  9. }
      由上面的代码知道我们确实只用了一个数组实现了这个问题,为什么可以呢?
    
   上面说了,因为我们每次只是简单地用上次的结果计算当前这次的值 ,那么当这次算完了以后,上次的结果是不是没用了呢?
    
    那是对的,哈哈。。。因为我们关心的只是这次啦 。。。于是有人想,是不是可以设两个数组呢,数组1用来存上次的,然后
       数组2用来根据数组1存这次的结果,然后数组2在下一次计算时又成了上一的,则数组1成了这一次的。
   我们看:在以前的算法代码中,
if(select[i-1][w-goods[i].volum]+goods[i].value>select[i-1][w]){
select[i][w]=select[i-1][w-goods[i].volum]+goods[i].value;
也就是根据i-1的计算结果来计算第i次的计算结果。
 

转载于:https://www.cnblogs.com/yml435/p/4655567.html

你可能感兴趣的文章
SQL GRANT
查看>>
2018/12/06 L1-022 L1-022 奇偶分家 Java
查看>>
登陆软件bug
查看>>
jquery validate使用笔记
查看>>
主要的几个脑网络——整理自eegfmri的博客
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
CABasicAnimation animationWithKeyPath Types
查看>>
JavaScript--eval
查看>>
iOS6与iOS7屏幕适配技巧
查看>>
获取视图尺寸大小方法
查看>>
mysql 历史记录查询
查看>>
sqoop连接Oracle数据库错误异常
查看>>
伪类与超链接
查看>>
HTML语言的一些元素(二)
查看>>
一段js代码的分析
查看>>
centos 7 redis-4.0.11 主从
查看>>
Java的基本数据类型与转换
查看>>
博弈论 从懵逼到入门 详解
查看>>
AndroidStudio中获得的VersionCode一直为1和VersionName一直为1.0
查看>>
【搜索引擎基础知识1】搜索引擎基本架构 2014-05-23 16:00 568人阅读 评论(0) 收藏...
查看>>