用C语言写一个程序,解决01背包问题,输入第一行为背包容量,输入第二行为value,输入第三行为weight,要求输出optimal value和所有optimal solution
时间: 2023-07-14 20:14:14 浏览: 87
好的,这里是用C语言实现的01背包问题的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define MAX_W 1000
int N, W;
int V[MAX_N], Wt[MAX_N];
int dp[MAX_N + 1][MAX_W + 1];
// 计算最大价值并输出所有最优解
void solve() {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < N; i++) {
for (int j = 0; j <= W; j++) {
if (j < Wt[i]) {
dp[i + 1][j] = dp[i][j];
} else {
int v1 = dp[i][j];
int v2 = dp[i][j - Wt[i]] + V[i];
if (v1 > v2) {
dp[i + 1][j] = v1;
} else if (v1 < v2) {
dp[i + 1][j] = v2;
} else {
dp[i + 1][j] = v1;
}
}
}
}
int res = dp[N][W];
printf("optimal value: %d\n", res);
// 输出所有最优解
int cnt = 0;
int selected[MAX_N] = {0};
for (int i = N - 1, j = W; i >= 0; i--) {
if (j >= Wt[i] && dp[i][j] == dp[i + 1][j - Wt[i]] + V[i]) {
selected[cnt++] = i;
j -= Wt[i];
}
}
// 输出选择的物品
printf("optimal solution:\n");
for (int i = cnt - 1; i >= 0; i--) {
printf("%d ", selected[i] + 1);
}
printf("\n");
}
int main() {
scanf("%d%d", &W, &N);
for (int i = 0; i < N; i++) {
scanf("%d", &V[i]);
}
for (int i = 0; i < N; i++) {
scanf("%d", &Wt[i]);
}
solve();
return 0;
}
```
程序的输入格式为:
```
背包容量 N
value_1 value_2 ... value_N
weight_1 weight_2 ... weight_N
```
其中 value_i 表示第 i 个物品的价值,weight_i 表示第 i 个物品的重量。程序的输出格式为:
```
optimal value: 最大价值
optimal solution:
选择的物品编号
```
例如,对于如下输入:
```
50 3
60 100 120
10 20 30
```
程序的输出为:
```
optimal value: 220
optimal solution:
2 3
```
表示最大价值是 220,选择的物品是 2 和 3。
阅读全文