分支界限法解决01背包代码
时间: 2023-12-20 09:30:08 浏览: 72
下面是使用分支界限法解决01背包问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
typedef struct {
int v; // 价值
int w; // 重量
} Item;
int n; // 物品数量
int W; // 背包容量
Item items[MAX_N]; // 物品数组
int max(int a, int b) {
return a > b ? a : b;
}
int bound(int i, int w, int v) {
int j;
int totw; // 总重量
double bound; // 上界
if (w >= W) {
return 0;
}
bound = v;
totw = w;
j = i + 1;
while (j < n && totw + items[j].w <= W) {
totw += items[j].w;
bound += items[j].v;
j++;
}
if (j < n) {
bound += (W - totw) * items[j].v / (double)items[j].w;
}
return bound;
}
int dfs(int i, int w, int v) {
if (i == n) {
return v;
}
int ans = 0;
if (w + items[i].w <= W) {
ans = max(ans, dfs(i + 1, w + items[i].w, v + items[i].v));
}
if (bound(i, w, v) > ans) {
ans = max(ans, dfs(i + 1, w, v));
}
return ans;
}
int main() {
scanf("%d%d", &n, &W);
for (int i = 0; i < n; i++) {
scanf("%d%d", &items[i].v, &items[i].w);
}
printf("%d\n", dfs(0, 0, 0));
return 0;
}
```
其中,`bound`函数用于计算当前节点的上界,`dfs`函数用于进行深度优先搜索。
阅读全文