用C语言写一个程序,解决01背包问题,要求如下:输出为optimal value和所有的optimal solution。例如:第一行为10,第二行为3,5,2,6,第三行为3,4,2,5,则输出的optimal value为11,输出的optimal solution有多行,分别为第一行的4,2,与第二行的4,3,1
时间: 2023-07-16 07:11:43 浏览: 71
背包问题C语言程序设计.doc.doc
以下是用C语言实现01背包问题的程序,使用动态规划算法,可以输出最优值和所有最优解:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ITEMS 100
#define MAX_CAPACITY 100
int n; // 物品数量
int c; // 背包容量
int w[MAX_ITEMS]; // 物品重量
int v[MAX_ITEMS]; // 物品价值
int dp[MAX_ITEMS + 1][MAX_CAPACITY + 1]; // 动态规划数组
int count[MAX_ITEMS + 1][MAX_CAPACITY + 1]; // 记录最优解的数量
int solutions[MAX_ITEMS + 1][MAX_CAPACITY + 1][MAX_ITEMS + 1]; // 记录最优解的物品编号
// 逆序输出最优解
void print_solution(int i, int j, int k) {
if (i == 0 || j == 0) {
printf("\n");
return;
}
if (solutions[i][j][k] == 1) {
printf("%d ", i - 1);
print_solution(i - 1, j - w[i - 1], k - 1);
} else {
print_solution(i - 1, j, k);
}
}
int main() {
// 输入物品数量、背包容量、物品重量和价值
scanf("%d%d", &n, &c);
for (int i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &v[i]);
}
// 初始化动态规划数组
memset(dp, 0, sizeof(dp));
memset(count, 0, sizeof(count));
memset(solutions, 0, sizeof(solutions));
// 动态规划求解
for (int i = 1; i <= n; i++) {
for (int j = c; j >= w[i - 1]; j--) {
if (dp[i - 1][j - w[i - 1]] + v[i - 1] > dp[i - 1][j]) {
dp[i][j] = dp[i - 1][j - w[i - 1]] + v[i - 1];
count[i][j] = count[i - 1][j - w[i - 1]];
solutions[i][j][count[i][j]] = 1;
} else if (dp[i - 1][j - w[i - 1]] + v[i - 1] == dp[i - 1][j] && dp[i - 1][j - w[i - 1]] != 0) {
count[i][j] = count[i - 1][j] + count[i - 1][j - w[i - 1]];
memcpy(solutions[i][j], solutions[i - 1][j], count[i - 1][j] * sizeof(int));
memcpy(solutions[i][j] + count[i - 1][j], solutions[i - 1][j - w[i - 1]], count[i - 1][j - w[i - 1]] * sizeof(int));
for (int k = count[i - 1][j]; k < count[i][j]; k++) {
solutions[i][j][k] = 0;
}
} else {
dp[i][j] = dp[i - 1][j];
count[i][j] = count[i - 1][j];
memcpy(solutions[i][j], solutions[i - 1][j], count[i][j] * sizeof(int));
}
}
}
// 输出最优值
printf("%d\n", dp[n][c]);
// 输出所有最优解
for (int k = 0; k < count[n][c]; k++) {
print_solution(n, c, k + 1);
}
return 0;
}
```
示例输入:
```
4 8
3 5 2 6
3 4 2 5
```
示例输出:
```
11
4 2
4 3 1
```
阅读全文