您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 01背包较好理解的讲解
动态规划之01背包问题(最易理解的讲解)分类:01背包动态规划2012-07-0617:0931770人阅读评论(13)收藏举报算法c01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。01背包的状态转换方程f[i,j]=Max{f[i-1,j-Wi]+Pi(j=Wi),f[i-1,j]}f[i,j]表示在前i件物品中选择若干件放在承重为j的背包中,可以取得的最大价值。Pi表示第i件物品的价值。决策:为了背包中物品总价值最大化,第i件物品应该放入背包中吗?题目描述:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?nameweightvalue12345678910a26066991212151515b23033669991011c65000666661011d54000666661010e460006666666只要你能通过找规律手工填写出上面这张表就算理解了01背包的动态规划算法。首先要明确这张表是至底向上,从左到右生成的。为了叙述方便,用e2单元格表示e行2列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为2的背包,那么这个背包的最大价值是0,因为e物品的重量是4,背包装不了。对于d2单元格,表示只有物品e,d时,承重为2的背包,所能装入的最大价值,仍然是0,因为物品e,d都不是这个背包能装的。同理,c2=0,b2=3,a2=6。对于承重为8的背包,a8=15,是怎么得出的呢?根据01背包的状态转换方程,需要考察两个值,一个是f[i-1,j],对于这个例子来说就是b8的值9,另一个是f[i-1,j-Wi]+Pi;在这里,f[i-1,j]表示我有一个承重为8的背包,当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值f[i-1,j-Wi]表示我有一个承重为6的背包(等于当前背包承重减去物品a的重量),当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值f[i-1,j-Wi]就是指单元格b6,值为9,Pi指的是a物品的价值,即6由于f[i-1,j-Wi]+Pi=9+6=15大于f[i-1,j]=9,所以物品a应该放入承重为8的背包以下是actionscript3的代码[java]viewplaincopy在CODE上查看代码片派生到我的代码片publicfunctionget01PackageAnswer(bagItems:Array,bagSize:int):Array{varbagMatrix:Array=[];vari:int;varitem:PackageItem;for(i=0;ibagItems.length;i++){bagMatrix[i]=[0];}for(i=1;i=bagSize;i++){for(varj:int=0;jbagItems.length;j++){item=bagItems[j]asPackageItem;if(item.weighti){//i背包转不下itemif(j==0){bagMatrix[j][i]=0;}else{bagMatrix[j][i]=bagMatrix[j-1][i];}}else{//将item装入背包后的价值总和varitemInBag:int;if(j==0){bagMatrix[j][i]=item.value;continue;}else{itemInBag=bagMatrix[j-1][i-item.weight]+item.value;}bagMatrix[j][i]=(bagMatrix[j-1][i]itemInBag?bagMatrix[j-1][i]:itemInBag)}}}//findanswervaranswers:Array=[];varcurSize:int=bagSize;for(i=bagItems.length-1;i=0;i--){item=bagItems[i]asPackageItem;if(curSize==0){break;}if(i==0&&curSize0){answers.push(item.name);break;}if(bagMatrix[i][curSize]-bagMatrix[i-1][curSize-item.weight]==item.value){answers.push(item.name);curSize-=item.weight;}}returnanswers;}PackageItem类[java]viewplaincopy在CODE上查看代码片派生到我的代码片publicclassPackageItem{publicvarname:String;publicvarweight:int;publicvarvalue:int;publicfunctionPackageItem(name:String,weight:int,value:int){this.name=name;this.weight=weight;this.value=value;}}测试代码[java]viewplaincopy在CODE上查看代码片派生到我的代码片varnameArr:Array=['a','b','c','d','e'];varweightArr:Array=[2,2,6,5,4];varvalueArr:Array=[6,3,5,4,6];varbagItems:Array=[];for(vari:int=0;inameArr.length;i++){varbagItem:PackageItem=newPackageItem(nameArr[i],weightArr[i],valueArr[i]);bagItems[i]=bagItem;}vararr:Array=ac.get01PackageAnswer(bagItems,10);
本文标题:01背包较好理解的讲解
链接地址:https://www.777doc.com/doc-3048657 .html