6、0-1背包问题优化

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次的计算结果。

来自为知笔记(Wiz)

时间: 2024-10-09 17:12:04

6、0-1背包问题优化的相关文章

AS3.0网页游戏优化一

有道无术,术尚可求,有术无道,止于术.神即道,道法自然,如来! 借用上面的一句话,来开启AS3.0网页优化的一些策略,在从事大约两年多的网页游戏行业,对于AS3.0性能优化,有一些自己的见解和想法,及此分享给大家,仅供抛砖引玉,鄙人拙见,愿给从事网页游戏的人以启迪. 我认为AS3.0的性能分两部分,第一部分是技术性优化,就是在理解flash 弹性跑道模型渲染原理和AVM本身一些垃圾回收原则等,对自己的程序进行一系列的性能优化.第二部分是游戏逻辑性优化.我只从事过2.5D arpg网页游戏的制作,

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

Centos6.5/7.0安装后优化(实验用)

############################################################################## #Centos6.5/7.0安装后优化(实验用)2014.07.18 ############################################################################## # 优化条目: # 1.修改ip地址.网关.主机名.DNS等 # 2.关闭selinux,清空iptables #

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所

0/1背包问题的动态规划法求解 —— Java 实现

0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握. 值得提及的一个问题是,在用 JAVA 实现时, 是按算法模型建模,还是用对象模型建模呢? 如果用算法模型,那么 背包的值.重量就直接存入二个数组里:如果用对象模型,则要对背包以及背包问题进行对象建模.思来想去,还是采用了对象模型,尽管心里感觉算法模型似乎更好一些.有时确实就是这样,对象模型虽然现在很主流,但也不是万能的,采用

动态规划算法实现部分——0/1背包问题

代码: import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.pri

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

RedHadoop创始人童小军在北京开讲“Hadoop2.0集群优化与管理”啦!

一.活动介绍 目前Hadoop的应用越来越广泛,开始被很多企业采用,且Hadoop人才十分稀缺和抢手,待遇也远比Java..Net开发好.为了帮助您快速掌握Hadoop的前沿技术,了解企业应用Hadoop的性能优化,CSDN特别邀请您参加我们精心策划的Hadoop2.0运维管理与集群安装监控管理实训班.届时,在历时一天的实训班上,RedHadoop创始人童小军将为您分享Hadoop企业应用成功案例.讲解Hadoop技术架构知识与小窍门. 期待您的加入,名额有限,感兴趣的小伙伴们欲报从速哦!另外,

最全 webpak4.0 打包性能优化清单

最全 webpak4.0 打包性能优化清单 webpack4.0如何进行打包优化? 无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单 1.使用loader的时候尽量指定exclude和inlucde来提高文件查找效率,避免不必要的查找,设置noParse参数 module: { noParse: /jquery/, // 不去解析jquery中的依赖 rules:[ { test: /\.js?$/, use: [ { loader: 'babel-lo