Problem A
0-1背包问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
需对容量为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;
struct mine
{
int w;
int p;
};
mine data[20];
int Max;
int c, n;
void dfs(int k, int sv, int sw)
{
if(k == n)
{
if(sv > Max && sw <= c)
{
Max = sv;
}
return;
}
//选(左子树)
dfs(k+1, sv + data[k].p, sw + data[k].w);
//不选(右子树)
dfs(k+1, sv, sw);
}
int main(int argc, char const *argv[])
{
while(cin >> n >> c)
{
if(n == 0 && c == 0)
{
break;
}
for (int i = 0; i < n; ++i)
{
cin >> data[i].w;
}
for (int i = 0; i < n; ++i)
{
cin >> data[i].p;
}
Max = 0;
dfs(0,0,0);
cout<<Max<<endl;
}
return 0;
}