c语言动态规划完全背包问题不光求出最优值(即背包达到的最大价值),还要给出最优解(即每个物品装还是不装,输出xi最后取值)。解释代码并算出时间复杂度
时间: 2024-02-07 22:02:29 浏览: 62
以下是动态规划完全背包问题的求解代码,同时输出了每个物品装还是不装的最优解:
```c
#include <stdio.h>
#include <stdlib.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int n, c;
scanf("%d %d", &n, &c);
int w[n], v[n];
for (int i = 0; i < n; i++) {
scanf("%d %d", &w[i], &v[i]);
}
int dp[c+1];
int path[n][c+1];
for (int i = 0; i <= c; i++) {
dp[i] = 0;
}
for (int i = 0; i < n; i++) {
for (int j = w[i]; j <= c; j++) {
if (dp[j-w[i]] + v[i] > dp[j]) {
dp[j] = dp[j-w[i]] + v[i];
for (int k = 0; k < i; k++) {
path[k][j] = path[k][j-w[i]];
}
path[i][j] = 1;
}
}
}
printf("%d\n", dp[c]);
for (int i = 0; i < n; i++) {
printf("%d ", path[i][c]);
}
printf("\n");
return 0;
}
```
首先,输入物品个数n和背包容量c,以及每个物品的重量w和价值v。
然后,定义一个长度为c+1的数组dp,表示背包容量从0到c的最大价值。同时,定义一个二维数组path,表示每个物品装还是不装的最优解。其中,path[i][j]为1表示第i个物品装入,为0表示不装入。
接下来,初始化dp数组全部为0。
然后,对于每个物品i,从其重量w[i]开始,遍历所有的背包容量j,若dp[j-w[i]]+v[i]大于dp[j],则更新dp[j]的值为dp[j-w[i]]+v[i]。同时,更新path数组,将前面所有物品的装或不装情况复制到当前物品的装或不装情况中,再将当前物品的装或不装情况更新为1或0。
最后,输出dp[c]即为背包达到的最大价值,输出path数组即为每个物品装还是不装的最优解。
时间复杂度:O(nc),其中n为物品个数,c为背包容量。
阅读全文