先亮出题目:
一,背包问题 及 回溯法解其问题的伪代码
二,赋值后的具体实例
三,如何看懂伪代码
(1)真正了解回溯法的核心思想
我总结的回溯法解题步骤:
<1>先找出第一个解
<2>回溯
(2)回溯法核心思想 + 伪代码 + 图9-5 树结构来分析
四,伪代码代入值解析
核心:先找到第一个解,再回溯。 cw=0;//背包当前重量 初始值 cp=0;//背包当前价值 初始值 k=1;//第一个物品 n=8;//共8个物品 W=110 第一步:得出第1个可行解: (1)k=1 k=1 <=8 and 0+1<110 //如果把第1个物品放入背包中,背包中物品重量1<背包容量110 可放入 cw=0+1=1; //把第1个物品放入背包后,目前背包重量=1 cp=0+11=11; //把第1个物品放入背包后,目前背包价值=11 Y[1]=1; //第1个物品放入背包中,则给Y[1]赋值为1 K=1+1=2; //尝试放第2个物品 (2)k=2 K=2 <=8 and 1+11<110 //如果再把第2个物品放入背包中,背包中物品重量12<背包容量110 可放入 cw=1+11=12; //把第2个物品放入背包后,目前背包重量=12 cp=11+21=32; //把第2个物品放入背包后,目前背包价值=32 Y[2]=1; //第2个物品放入背包中,则给Y[2]赋值为1 K=2+1=3; //尝试放第3个物品 (3)k=3 K=3 <=8 and 12+21=33<110 //如果把第3个物品放入背包中,背包中物品重量33<背包容量110 可放入 cw=12+21=33; //把第3个物品放入背包后,目前背包重量=33 cp=32+31=63; //把第3个物品放入背包后,目前背包价值=63 Y[3]=1; //第3个物品放入背包中,则给Y[3]赋值为1 K=3+1; //尝试放第4个物品 (4)k=4 K=4<8 and 33+23=56 //如果把第4个物品放入背包中,背包中物品重量 56<背包容量110 可放入 cw=33+23=56; //把第4个物品放入背包后,目前背包重量=56 cp=63+33=96; //把第4个物品放入背包后,目前背包价值=96 Y[4]=1; //第4个物品放入背包中,则给Y[4]赋值为1 K=4+1; //尝试放第5个物品 (5)k=5 K=5 <=8 and 56+33=89<110 //如果把第5个物品放入背包中,背包中物品重量89<背包容量110 可放入 cw=56+33=89; //把第5个物品放入背包中,目前背包重量=86 cp=96+43=139; //把第 5 个物品放入背包中,目前背包价值=139 Y[5]=1; //第5个物品放入背包中,则给Y[5]赋值为1 K=5+1; //尝试放第6个物品 (6)k=6 K=6 <=8 and 89+43=132>110 //如果把第6个物品放入背包中,背包中物品重量132>背包容量110 不可放入 Y[6]=0; //第6个物品不能放入背包中,则给Y[6]赋值为0 BOUND(139,89,6,110)=139 > fp=-1 K=6+1=7 (7)k=7 <= 8 and 89+45 > 110 //如果把第7个物品放入背包中,背包中物品重量 134 > 背包容量110 不可放入 Y[7]=0; //第7个物品不能放入背包中,则给Y[7]赋值为0 BOUND(139,89,7,110)=139 > fp=-1 K=7+1 (8)k=8 <=8 and 89+55>110 //如果把第8个物品放入背包中,背包中物品重量 144 > 背包容量110 不可放入 Y[8]=0; //第8个物品不能放入背包中,则给Y[8]赋值为0 BOUND(139,89,8,110)=139 > fp=-1 K=8+1 (9)k=9 >n=8 Fp=cp=139; Fw=cw=89; K=8; X=[1,1,1,1,1,0,0,0]; 输出第1个可行解X=[1,1,1,1,1,0,0,0] 第二步:回溯 得出第2个解 此时k=8 BOUND(139,89,8,110)=139 <= fp=139 //前8个物品分别已经确定了是否放入 k=8-1 k=7 != 0 and Y[7]!=1 k=7-1 k=6!=0 and Y[6]!=1 k=6-1 k=6!=0 and Y[5]=1 Y[5]=0 cw=89-33=56 cp=139-43=96 BOUND(96,56,5,110)=149 >= fp=139 //前5个物品分别已经确定了是否放入 1,1,1,1,0 计算后3个物品是否放入 K=5+1 K=6 <=8 and 56+43=99<=110 cw=56+43=99 cp=96+53=149 Y[k]=1 K=6+1 K=7 <= 8 and 99+45 > 110 Y[7]=0 BOUND(149,99,7,110)=149 > fp=139 K=7+1 K=8 <=8 and 99+55>110 Y[8]=0 BOUND(149,99,8,110)=149 > fp=139 K=8+1 K=9>8 Fp=cp=149 Fw=cw=99 K=8 X=Y=[1,1,1,1,0,1,0,0] 输出第2个可行解X= [1,1,1,1,0,1,0,0] ………继续回溯得到第3个解 ………………………….第4个解 …………………………..
五,总结
文字语言表达能力差,但自认为回溯法的背包问题已经研究通了。对于算法相当薄弱的我,突然对这部分有了较大兴趣,近几天在研究其他算法,略懂皮毛。有意者可面对面交流。
回溯法解背包问题分析
时间: 2024-12-24 03:33:48