#include<iostream>
using namespace std;
int dp[100][100];
int x[100];
int max(int a, int b) {
return a>b?a:b;
}
int value(int w[], int v[], int n, int c) {
int i, j;
for (i = 0; i <= n; i++) //初始化第0列
dp[i][0] = 0;
for (j = 0; j <= c; j++) //初始化第0行
dp[0][j] = 0;
for (i = 1; i <= n; i++){ //计算第i行,进行第i次迭代
for (j = 1; j <= c; j++) {
if (j < w[i - 1]) //判断当前背包容量是否小于物品重量
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
}
}
for (i = n, j = c; i >= 0; i--){ //求装入背包的物品
if (dp[i][j] > dp[i - 1][j]) {
x[i - 1] = 1;
j = j - w[i - 1];
} else
x[i - 1] = 0;
}
return dp[n][c]; //返回背包取得的最大价值
}
int main() {
int n, c, w[100], v[100]; //n为物品数量,c为背包容量,w为每件物品对应的重量,v为每件物品对应的价值
cout << "请输入物品个数:" << endl;
cin >> n;
cout << "请输入背包容量:" << endl;
cin >> c;
cout << "请输入每件物品的重量:" << endl;
for (int i = 0; i < n; i++) {
std::cin >> w[i]; //输入每件物品的重量
}
cout << "请输入每件物品的价值:" << endl;
for (int i = 0; i < n; i++) {
std::cin >> v[i]; //输入每件物品的价值
}
cout << "背包最大价值是:" << value(w, v, n, c) << endl;
cout << "装入的物品分别是:";
for (int i = 0; i < n; i++) {
if (x[i] == 1)
cout << "物品" << i + 1 << ' ';
}
return 0;
}
01背包问题
最新推荐文章于 2024-06-30 10:48:39 发布