
輸入要求
有多組數據。
每組數據包含2部分。
第一部分包含兩個整數C (1 <= C <= 10000)和 n (1 <= n <= 10,分別表示背包的容量和物品的個數。
第二部分由n行數據,每行包括2個整數 wi(0< wi <= 100)和 vi(0 < vi <= 100),分別表示第i個物品的總量和價值
輸出要求
對於每組輸入數據,按出隊次序輸出每個結點的信息,包括所在層數,編號,背包中物品重量和價值。
每個結點的信息占一行,如果是葉子結點且其所代表的背包中物品價值大於當前最優值(初始為0),則輸出當前最優值 bestv 和最優解 bestx(另占一行)
參見樣例輸出
測試數據
輸入示例
5 3
2 2
3 2
2 3
輸出示例
1 1 0 0
2 2 2 2
2 3 0 0
3 4 5 4
3 5 2 2
3 6 3 2
3 7 0 0
4 9 5 4
bestv=4, bestx=[ 1 1 0 ]
4 10 4 5
bestv=5, bestx=[ 1 0 1 ]
4 11 2 2
4 12 5 5
4 13 3 2
4 14 2 3
4 15 0 0
#include<stdio.h>
#include<math.h>
typedef struct {
int no; // 結點標號
int id; // 節點id
int sw; // 背包中物品的重量
int sv; // 背包中物品的價值
}Node;
void branchknap(int *w,int *v,int n,int c) {
int bestv = 0;
int f = 0;
int r = 0;
Node que[3000];
int path[15];
que[0].no = 1;
que[0].id = que[0].sv = que[0].sw = 0;
while(f <= r) {
Node node = que[f];
printf("%d %d %d %d\n",node.id+1,node.no,node.sw,node.sv);
if(node.no >= pow(2,n)) {
if(node.sv > bestv) {
bestv = node.sv;
printf("bestv=%d, bestx=[",bestv);
int temp = node.no;
int i = 0;
while(temp > 1) {
if(temp % 2 == 0)
path[i] = 1;
else
path[i] = 0;
temp /= 2;
i++;
}
i--;
while(i >= 0) {
printf(" %d",path[i]);
i--;
}
printf(" ]\n");
}
} else {
if((node.sw + w[node.id + 1]) <= c) {
r++;
que[r].id = node.id + 1;
que[r].no = node.no * 2;
int id = node.id + 1;
que[r].sv = node.sv + v[id];
que[r].sw = node.sw + w[id];
}
r++;
que[r].id = node.id + 1;
que[r].no = node.no * 2 + 1;
que[r].sv = node.sv;
que[r].sw = node.sw;
}
f++;
}
}
int main() {
int c,n;
int w[15],v[15];
while(~scanf("%d %d",&c,&n)) {
for(int i = 1; i <= n; i++) {
scanf("%d %d",&w[i],&v[i]);
}
branchknap(w,v,n,c);
}
return 0;
}
