问题描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量是wi,且不能超过轮船总载重量。即Σwi<=c1+c2。若集装箱能全部装载则输出YES, 否则输出为NO,n为0时结束输入。
问题模型:解子集空间树。
解决思路:首先将第一艘轮船尽可能的装满。然后将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能的装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近c1。第一艘船装载完后,根据剩余的集装箱重量与c2轮船载重量比较。若剩余的集装箱重量<=c2则能装入到两艘船。(求出不超过c1的最大值max,若集装箱总重量-max<=c2则能装入到两艘船)
c1最大装载代码:
void backpack(int t){
if(t>n){
if(cw>bestw){
bestw = cw;
}
}else{
for(int j = 0;j<=1;j++){ //枚举物体t所有可能的路径,
x[t] = j;
if(cw+w[t]*x[t]<=c1){ //约束为当前集装箱的重量不能超过c1剩余重量
cw+=w[t]*x[t];
backpack(t+1);
cw-=w[t]*x[t];
}
}
}
}
完整代码:
/**
&#