使用回溯法解决0-1背包问题,并给出c语言代码
时间: 2024-03-22 15:42:05 浏览: 321
好的,以下是使用回溯法解决0-1背包问题的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
int n, c; // 物品数量和背包容量
int w[MAXN], v[MAXN]; // 物品重量和价值
int cw = 0, cv = 0; // 当前重量和价值
int bestv = 0; // 最优价值
int x[MAXN]; // 当前解
void backtrack(int i) {
if (i > n) {
if (cv > bestv) {
bestv = cv;
for (int j = 1; j <= n; ++j) {
x[j] = w[j];
}
}
return;
}
if (cw + w[i] <= c) {
cw += w[i];
cv += v[i];
x[i] = 1;
backtrack(i+1);
cw -= w[i];
cv -= v[i];
}
x[i] = 0;
backtrack(i+1);
}
int main() {
scanf("%d%d", &n, &c);
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &w[i], &v[i]);
}
backtrack(1);
printf("最优价值:%d\n", bestv);
printf("选中的物品:");
for (int i = 1; i <= n; ++i) {
if (x[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
```
该代码中,backtrack函数是回溯的核心部分,它通过枚举每个物品放或不放来搜索最优解。x数组记录当前选择的物品,bestv记录最优价值。在回溯结束后,输出最优价值和选中的物品即可。
阅读全文