搜的
//物品数量:5
//背包容量:承重20
//定义重量:0 2 3 4 5 9
//定义价值:0 3 4 5 8 10
#include<stdio.h>
int B[6][21] = { 0 };//背包可以装6个 承重21
int W[6] = { 0, 2, 3, 4, 5, 9 };
int V[6] = { 0,3,4,5,8,10 };
int choose[6];
int max(int a, int b) {//大小比较
return (a > b ? a : b);
}
void solo() {//背包算法核心部分
for (int i = 1; i < 6; i++) {//i为当前可选物品数
for (int j = 1; j < 21; j++) {//j为当前可承重量
if (W[i] > j) {
B[i][j] = B[i-1][j];//不偷
}
else {
B[i][j]=max(B[i - 1][j], B[i - 1][j-W[i]] + V[i]);//偷与不偷比较
}
}
}
}
void fine() {//输出最佳的选择
int i = 5;
int j = 20;
while (i!=0) {
if (B[i][j] != B[i - 1][j]) {//如果i选择和i-1的选择不等则已偷,反则没有偷
printf("选择了%d号物品\n", i);
j = j - W[i];
i--;
}
else {
i--;
}
}
}
int main() {
solo();
for (int i = 0; i < 6; i++) {//i为当前可选物品数
for (int j = 0; j < 21; j++) {//j为当前可承重量
printf("%3d", B[i][j]);
}printf("\n");
}
printf("\n");
fine();
return 0;
}