自己实现的算法,其实我的实现的思想是受0-1背包问题的启发,整个问题的求解过程其实就是一棵树的遍历,树的每个节点的两个枝分别代表当前该物品装和不装进行的:
下面这个算法是我受0-1背包的思想自己实现的:
#include<stdio.h>
int weight[4] = {0,10,40,20}; //0号位置不使用
int x[4]; //记录i号物品所装入箱子的号码,
int c1 = 30;//1号箱子的容量
int c2 = 40; //2号箱子的容量
bool BackTrace(int i);
int main(){
BackTrace(1);
}
bool BackTrace(int i){
if (i>3 && c1>=0 && c2>=0){ //当遍历到树的根部时候,满足这些条件的时候打印
for (int j=1; j<=3; j++){
printf("%d",x[j]);
}
printf("\n");
return true;
}
c1 = c1 - weight[i]; //当把i号物品装入1号箱子的时候
if (c1 >= 0){ //满足这个条件时候才能装入 1号箱子
x[i] = 1;
BackTrace(i+1);
}
//当把i号物品装入2号箱子的时候,
c1 = c1 + weight[i];//当然要做的当然是将1号箱子回复原状
x[i] = 0;
c2 = c2 - weight[i];
if (c2 >= 0){//满足这个条件时候才能装入 2号箱子
x[i] = 2;
BackTrace(i+1);
}
//下面这这两句的道理我有点理解,但是现在还说不清楚,反正必须加上 这两句
c2 = c2 + weight[i];
x[i] = 0;
}