回溯法 | 子集树:01背包

上文链接:

9大背包第一弹 | 01背包

 再谈01背包 | 使用【跳跃点集合】代替【求解矩阵】解题


 

java代码:

 1 class _01Package{
 2     int[]w;
 3     int[]v;
 4     int len=0;//物品数量
 5     int weightMax=0;//背包最大装载量
 6     int[]x;//当前解
 7     int[]bestX;//最优解
 8     int bestValue=0;
 9     int nowWeight=0;//当前背包中物品的重量
10     int restWeight=0;//所有物品的剩余重量
11     _01Package(int[]w,int[]v,int weightMax){
12         this.w=w;
13         this.v=v;
14         this.weightMax=weightMax;
15         len=w.length;
16         x=new int[len];
17         bestX=new int[len];
18         //初始化restWeight
19         int i=0;
20         for(i=0;i<len;i++){
21             restWeight+=w[i];
22         }
23         int a;
24         a=0;
25     }
26 //按照我的思路写的
27       void BackTrace(int t){
28         if(t<len){
29             int a;
30             a=0;
31             //遍历左子树
32             if(nowWeight+w[t]<weightMax){//物品可以放入背包
33                 restWeight-=w[t];
34                 nowWeight+=w[t];//更新当前重量
35                 x[t]=1;
36                 BackTrace(t+1);
37                 nowWeight-=w[t];
38                 restWeight+=w[t];
39             }
40             //遍历右子树
41             if(restWeight+nowWeight>weightMax){//如果剩余的重量全都放入背包,都可以装得满,说明肯定要放,x[t]铁定=1。否的话=0
42                 x[t]=0;
43                 BackTrace(t+1);
44             }
45             
46         }else{//遍历到了叶子结点
47             int i;
48             int tmpValue=0;
49             for(i=0;i<len;i++){
50                 if(x[i]==1) tmpValue+=v[i];
51             }
52             if(tmpValue>bestValue){
53                 bestValue=tmpValue;
54                 bestX=x.clone();
55             }
56         }
57     }
58 }

 

posted @ 2017-10-17 21:28  TQCAI  阅读(512)  评论(0编辑  收藏  举报