C语言贪心算法背包问题
时间: 2023-11-14 20:09:48 浏览: 143
好的,关于C语言贪心算法背包问题,我可以给你一些基本的思路和代码实现。
首先,背包问题是一个经典的动态规划问题,但是在某些情况下,使用贪心算法也可以得到较好的解。对于背包问题,我们可以将物品按照单位重量的价值从大到小排序,然后依次将物品放入背包中,直到背包装满或者所有物品都放完为止。
下面是C语言实现贪心算法解决背包问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
typedef struct {
int w; // 物品重量
int v; // 物品价值
double r; // 单位重量价值
} Item;
int cmp(const void *a, const void *b) {
Item *ia = (Item *)a; Item *ib = (Item *)b;
return ib->r > ia->r ? 1 : -1;
}
double knapsack(Item items[], int n, int W) {
qsort(items, n, sizeof(Item), cmp); // 按照单位重量价值从大到小排序
double value = 0.0; // 背包中物品的总价值
int i;
for (i = 0; i < n && W > 0; i++) {
if (items[i].w <= W) { // 物品可以全部放入背包中
value += items[i].v;
W -= items[i].w;
} else { // 物品只能部分放入背包中
value += items[i].r * W;
W = 0;
}
}
return value;
}
int main() {
int n, W;
Item items[MAX_N];
printf("请输入物品数量和背包容量:");
scanf("%d%d", &n, &W);
printf("请输入每个物品的重量和价值:\n");
int i;
for (i = 0; i < n; i++) {
scanf("%d%d", &items[i].w, &items[i].v);
items[i].r = (double)items[i].v / items[i].w; // 计算单位重量价值
}
double value = knapsack(items, n, W);
printf("背包中物品的总价值为:%.2f\n", value);
return 0;
}
```
阅读全文