题目描述
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
样例输入
1 2 1 1 2 3 2 2 3 4 0 0
样例输出
1 4
代码实现
#include <iostream>
using namespace std;
/*
* 使用暴力法求解01背包:对于每一个物品,要么放入,要么不放入,对于n个物品,一共有2^n个结果。
*/
int max(int a, int b) {
return a > b ? a : b;
}
int maxValue(int weight[], int value[], int i, int j,int sum_weight,int maxvalue) {
if (i < 0) { // 如果没有物品,则返回最大价值。
return maxvalue;
}
int i_tmp = i; // 创建临时变量i_tmp,用来保存i的值。
int v1 = 0, v2 = 0; // 存放不放入背包的价值和放入背包的价值。
// 不放入背包
i--;
v1 = maxValue(weight, value, i, j, sum_weight, maxvalue);
// 放入背包
sum_weight += weight[i_tmp];
maxvalue += value[i_tmp];
i_tmp--;
if (j < sum_weight) { // 判断后,不能放入背包中,返回 不放入背包的最大价值
return v1;
}
// 判断后,能放入背包中
v2 = maxValue(weight, value, i_tmp, j, sum_weight, maxvalue);
// 找出放入背包或不放入背包,中的最大价值。
return max(v1, v2);
}
int main()
{
int n, c;
while (true)
{
cin >> n;
cin >> c;
if (n == 0 || c == 0) {
break;
}
cout << c << endl;
int* weight = new int[n];
for (int i = 0; i < n; i++) {
cin >> weight[i];
}
int* value = new int[n];
for (int i = 0; i < n; i++) {
cin >> value[i];
}
cout << endl;
int maxvalue = maxValue(weight, value, n - 1, c, 0, 0);
cout << maxvalue << endl;
delete[] weight;
delete[] value;
}
}