1、2022/10/27算法案例算法案例 0-1背包问题背包问题通信四班刘蕾、文艺蓉、周家欣2022/10/272/150-10-1背包问题背包问题问题描述:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?0-1背包问题:对每种物品i装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。2022/10/273/150-10-1背包问题背包问题解空间:设Xi表示第i件物品的取舍,1代表取,0代表舍,搜索的空间为n元一维数组(X1,X2,X3,,Xn)取值范围:为(0,0,0,0,0),(0,0,
2、0,0,1),(0,0,0,1,0),(0,0,0,1,1),(1,1,1,1,1)。2022/10/274/150-10-1背包问题背包问题解空间图示:以3个物品为例,解(0,1,0)表示(不取物品0,取物品1,不取物品2)root1001010100012022/10/275/150-10-1背包问题背包问题问题转化:给定c0,wi0,vi0,1in,要求找出一个n元0-1向量(x1,x2,xn),xi0,1,1in,使得wixic,而且vixi达到最大。2022/10/276/150-10-1背包问题背包问题由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:设所给0
3、-1背包问题的子问题的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,n时0-1背包问题的最优值。第第i+1个物品不装入背包个物品不装入背包第第i+1个物品装入背包个物品装入背包第第i+1个物品无法装入背包个物品无法装入背包2022/10/277/150-10-1背包问题背包问题vvoid Knapsack(int v,int w,int c,int n,int m)v int n=v.length-1;v int jMax=Math.min(wn-1,c);v for(j=0;j=jMax;j+)mnj =0;v for(j=wn;j 1;i-)v int jMa
4、x=Math.min(wi-1,c);v for(j=0;j=jMax;j+)mij =mi+1j;v for(j=wi;j=w1)m1c=Math.max(m1c,m2c-w1+v1);vM,横坐标表示所放物品号码,纵坐标表示横坐标表示所放物品号码,纵坐标表示背包容量背包容量1到到C,值表示当前考虑方案的价值,值表示当前考虑方案的价值不选择第不选择第i个物品个物品如何可以装下(重量允许)如何可以装下(重量允许)选择价值更大的方式(装入选择价值更大的方式(装入or不装入)不装入)处理边界情况处理边界情况处理边界情况处理边界情况2022/10/278/150-10-1背包问题背包问题012345
5、678910w1=2v1=61w2=2v2=32w3=6v3=53w4=5v4=44w5=4v5=650问题实例:有5个物品,其重量分别是2,2,6,5,4,价值分别为6,3,5,4,6,背包的容量为10。mij表示把第i,.,n物品装入容量为j的背包的最大价值2022/10/279/150-10-1背包问题背包问题012345678910w1=2v1=61w2=2v2=32w3=6v3=53w4=5v4=44w5=4v5=650问题实例:有5个物品,其重量分别是2,2,6,5,4,价值分别为6,3,5,4,6,背包的容量为10。0 00 00 00 066 66 66 66 66 66 6m
6、5=4=6m5=4=6mij表示把第i,.,n物品装入容量为j的背包的最大价值 int jMax=Math.min(wn-1,c);for(j=0;j=jMax;j+)mnj =0;for(j=wn;j 1;i-)int jMax=Math.min(wi-1,c);for(j=0;j=jMax;j+)mij =mi+1j;for(j=wi;j=c;j+)mij=Math.max(mi+1j,mi+1j-wi+vi);2022/10/2711/150-10-1背包问题背包问题012345678910w1=2v1=61w2=2v2=32w3=6v3=53w4=5v4=44w5=4v5=650问题实
7、例:有5个物品,其重量分别是2,2,6,5,4,价值分别为6,3,5,4,6,背包的容量为10。0 00 06 66 69 99 9121212121515151515150 00 03 33 36 66 69 99 99 9101011110 00 00 00 06 66 66 66 66 6101011110 00 00 00 06 66 66 66 66 6101010100 00 00 00 06 66 66 66 66 66 66 6mij表示把第i,.,n物品装入容量为j的背包的最大价值2022/10/2712/150-10-1背包问题背包问题vvoid Knapsack(int
8、v,int w,int c,int n,int m)v int n=v.length-1;v int jMax=Math.min(wn-1,c);v for(j=0;j=jMax;j+)mnj =0;v for(j=wn;j 1;i-)v int jMax=Math.min(wi-1,c);v for(j=0;j=jMax;j+)mij =mi+1j;v for(j=wi;j=w1)m1c=Math.max(m1c,m2c-w1+v1);vm,横坐标表示背包号码,纵坐标表示背包横坐标表示背包号码,纵坐标表示背包容量容量1到到C,值表示当前考虑方案的价值,值表示当前考虑方案的价值背包容量背包容量
9、0-wn-1,该物品装不下,该物品装不下n个物品个物品背包装不下物品背包装不下物品n,此时考虑物品,此时考虑物品n装入方法最大价值装入方法最大价值为零为零背包能装下物品背包能装下物品n,物品,物品n装入方法最大价值为装入方法最大价值为vn背包不能装下物品时背包不能装下物品时背包能装下物品时背包能装下物品时图示图示隐藏隐藏2022/10/27Traceback求最优解求最优解TemplateVoid Traceback(Type*m,int w,int c,int n,int x)for(int i=1;in;i+)if(mic=mi+1c)xi=0;elsexi=1;c-=wi;xn=(mnc
10、)?1:0;13/15按照按照KnapsackKnapsack计算后计算后m1cm1c给出的为给出的为0-10-1背包问题的最优值,然后按背包问题的最优值,然后按照上述照上述TracebackTraceback算法构造出最优解算法构造出最优解(x1,x2,x3,(x1,x2,x3,xn),xn)。2022/10/2714/150-10-1背包问题背包问题Traceback回溯过程:012345678910w1=2v1=61w2=2v2=32w3=6v3=53w4=5v4=44w5=4v5=650006699121215151500336699910110000666661011000066666101000006666666综上所述:本例中最大价值为综上所述:本例中最大价值为15,最优解向量为,最优解向量为(1,1,0,0,1)11001if(mic!=mi+1c)xi=1;c-=wi;if(mic!=mi+1c)xi=1;c-=wi;if(mic=mi+1c)xi=0;if(mic=mi+1c)xi=0;xn=(mnc)?1:0;2022/10/2715/15Thanku
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1