用C语言写一个程序,解决01背包问题,要求如下:输出为optimal value和所有的optimal solution。
时间: 2023-07-16 13:11:32 浏览: 125
以下是用C语言实现的01背包问题程序,包括输出optimal value和所有的optimal solution:
```c
#include <stdio.h>
#define MAXN 100
#define MAXW 1000
int w[MAXN], v[MAXN], f[MAXW], ans[MAXN], cnt, n, m;
int max(int a, int b) {
return a > b ? a : b;
}
void dfs(int x, int sum) {
if (x == n) {
if (sum == m) {
cnt++;
for (int i = 0; i < n; i++) {
if (ans[i]) printf("%d ", i + 1);
}
printf("\n");
}
return;
}
if (sum + w[x] <= m && f[sum + w[x]] == f[sum] - v[x]) {
ans[x] = 1;
dfs(x + 1, sum + w[x]);
}
if (f[sum] == f[sum + w[x]] + v[x]) {
ans[x] = 0;
dfs(x + 1, sum);
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d %d", &w[i], &v[i]);
}
for (int i = 0; i < n; i++) {
for (int j = m; j >= w[i]; j--) {
f[j] = max(f[j], f[j - w[i]] + v[i]);
}
}
printf("%d\n", f[m]);
dfs(0, 0);
printf("Total solutions: %d\n", cnt);
return 0;
}
```
程序中使用了DFS算法来输出所有的optimal solution,其中`ans`数组用于存储当前搜索到的可行解,`cnt`变量用于记录总共有多少个optimal solution。
输入的第一行为n和m,分别代表物品数量和背包容量。接下来的n行每行输入两个整数wi和vi,分别代表第i个物品的重量和价值。
程序首先对01背包问题进行动态规划求解,得到optimal value。然后调用DFS算法输出所有的optimal solution,具体实现如下:
1. 对于第x个物品,若选择它能够使背包剩余容量不小于0且选择后的总价值等于当前最优价值减去该物品的价值,则选择该物品,继续搜索下一个物品。
2. 对于第x个物品,若不选择它能够使背包剩余容量不小于0且选择后的总价值等于背包当前容量的最优价值,则不选择该物品,继续搜索下一个物品。
3. 若搜索到了第n个物品,则判断当前选择的物品是否满足背包容量为m,并且总价值等于optimal value,若满足则输出该可行解。
最后输出总共有多少个optimal solution。
阅读全文