回溯法 | 子集树: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 }

 

转载于:https://www.cnblogs.com/TQCAI/p/7684002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值