完全背包问题动态规划c++代码,并输出选取物品
时间: 2024-02-04 16:36:31 浏览: 57
以下是完全背包问题的动态规划代码,其中包括了输出选取物品的部分:
```
#include <stdio.h>
#define MAX_N 100
#define MAX_W 1000
int n, W;
int w[MAX_N], v[MAX_N];
int dp[MAX_N+1][MAX_W+1];
void solve() {
for (int i = 0; i < n; i++) {
for (int j = 0; j <= W; j++) {
for (int k = 0; k * w[i] <= j; k++) {
dp[i+1][j] = max(dp[i+1][j], dp[i][j-k*w[i]] + k*v[i]);
}
}
}
printf("最大价值为:%d\n", dp[n][W]);
// 输出选取的物品
int i = n, j = W;
int x[MAX_N] = {0};
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i-1][j]) {
x[i-1]++;
j -= w[i-1];
} else {
i--;
}
}
printf("选取的物品为:\n");
for (int i = 0; i < n; i++) {
if (x[i] > 0) {
printf("物品%d选取了%d个\n", i+1, x[i]);
}
}
}
int main() {
scanf("%d%d", &n, &W);
for (int i = 0; i < n; i++) {
scanf("%d%d", &w[i], &v[i]);
}
solve();
return 0;
}
```
输入格式为:
```
n W
w[0] v[0]
w[1] v[1]
...
w[n-1] v[n-1]
```
其中,n表示物品的数量,W表示背包的容量,w[i]和v[i]分别表示第i件物品的重量和价值。
输出格式为:
```
最大价值为:xxx
选取的物品为:
物品x选取了y个
物品x选取了y个
...
```
其中,最大价值表示背包能够装下的最大价值,选取的物品部分表示每个物品选取的个数。
阅读全文