穷举法01背包问题c语言
时间: 2023-11-19 07:54:55 浏览: 125
用回溯法解决01背包问题C语言实现
5星 · 资源好评率100%
根据提供的引用内容,可以看出这是一个Java语言的递归求解01背包问题的代码。如果您需要C语言的穷举法01背包问题的代码,可以参考以下思路和代码实现:
思路:
1. 枚举所有可能的物品组合,对于每一种组合,计算它们的总重量和总价值。
2. 如果总重量小于等于背包容量,且总价值大于当前最优解,则更新最优解。
3. 重复步骤1和2,直到枚举完所有可能的组合。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
int w[MAX_N], v[MAX_N]; // 物品的重量和价值
int n, c; // 物品数量和背包容量
int best_v = 0; // 最优解的总价值
int best_x[MAX_N]; // 最优解的物品组合
void dfs(int i, int cw, int cv, int *x) {
if (i == n) { // 达到叶子节点
if (cv > best_v && cw <= c) { // 更新最优解
best_v = cv;
for (int j = 0; j < n; j++) {
best_x[j] = x[j];
}
}
return;
}
x[i] = 0; // 不选第i个物品
dfs(i + 1, cw, cv, x);
x[i] = 1; // 选第i个物品
dfs(i + 1, cw + w[i], cv + v[i], x);
}
int main() {
scanf("%d%d", &n, &c);
for (int i = 0; i < n; i++) {
scanf("%d%d", &w[i], &v[i]);
}
int x[MAX_N] = {0}; // 当前物品组合
dfs(0, 0, 0, x);
printf("最优解的总价值为:%d\n", best_v);
printf("最优解的物品组合为:");
for (int i = 0; i < n; i++) {
printf("%d ", best_x[i]);
}
printf("\n");
return 0;
}
阅读全文