问题 f: 0-1 背包问题(动态规划)
时间限制: 1 Sec 内存限制: 128 MB
提交: 48 解决: 17
题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?
在选择装入背包的物品时,对每种物品i只能有两种选择,装入或者不装入,不能装入多次,也不能部分装入。
输入
第一行输入物品的个数n。
第二行输入物品的重量序列w。(中间有空格)
第三行输入物品的价值序列v。(中间有空格)
第四行输入背包容量c。
输出
第一行输出装入背包的物品。(用0和1表示,中间无空格)
第二行输出最大价值。
样例输入
3
3 4 5
4 5 6
10
样例输出
011
11
#include <iostream>
#include <algorithm>
using namespace std;
int n, c;
int w[101], v[101];
int choose[101];
int value[101][101];
void max() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= c; j++) {
if (j < w[i])value[i][j] = value[i - 1][j];
else value[i][j] = max(value[i - 1][j], value[i - 1][j - w[i]] + v[i]);
}
}
}
void find(int x, int y) {
if (x >= 0) {
if (value[x - 1][y] == value[x][y]) {
choose[x] = 0;
find(x-1,y);
}
else if ((y - w[x]) >= 0 && value[x][y] == (value[x - 1][y - w[x]] + v[x])) {
choose[x] = 1;
find(x - 1, y - w[x]);
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)cin >> w[i];
for (int i = 1; i <= n; i++)cin >> v[i];
cin >> c;
max();
find(n, c);
for (int i = 1; i <= n; i++)cout << choose[i];
cout << endl << value[n][c];
return 0;
}