先亮出题目:
一,背包问题 及 回溯法解其问题的伪代码
二,赋值后的具体实例
三,如何看懂伪代码
(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个解
…………………………..
五,总结
文字语言表达能力差,但自认为回溯法的背包问题已经研究通了。对于算法相当薄弱的我,突然对这部分有了较大兴趣,近几天在研究其他算法,略懂皮毛。有意者可面对面交流。