用c语言写一个贪心算法实现01背包问题
时间: 2023-11-18 07:04:15 浏览: 124
好的,下面是用C语言实现01背包问题的贪心算法:
```
#include <stdio.h>
// 定义物品结构体
struct item {
int weight; // 重量
int value; // 价值
};
// 比较函数,按照单位价值从大到小排序
int cmp(struct item a, struct item b) {
double va = (double) a.value / a.weight;
double vb = (double) b.value / b.weight;
return va > vb;
}
// 贪心算法
int knapsack(struct item items[], int n, int capacity) {
int i;
int max_value = 0;
int current_weight = 0;
// 按照单位价值从大到小排序
qsort(items, n, sizeof(struct item), cmp);
// 依次选择物品放入背包中
for (i = 0; i < n; i++) {
if (current_weight + items[i].weight <= capacity) {
current_weight += items[i].weight;
max_value += items[i].value;
} else {
// 背包已满,不能再放入物品
break;
}
}
return max_value;
}
int main() {
struct item items[] = {{10, 60}, {20, 100}, {30, 120}};
int n = 3;
int capacity = 50;
int max_value = knapsack(items, n, capacity);
printf("最大价值为:%d\n", max_value);
return 0;
}
```
在这个程序中,我定义了一个物品结构体,包含了物品的重量和价值。然后,我定义了一个比较函数 `cmp`,用于按照单位价值从大到小排序。最后,我实现了一个 `knapsack` 函数,用于解决01背包问题。在这个函数中,我首先对物品按照单位价值从大到小排序,然后依次选择物品放入背包中,直到背包已满或者所有物品都已经选择完毕。最后,函数返回背包中的最大价值。
在 `main` 函数中,我定义了一个包含3个物品的数组,然后调用 `knapsack` 函数解决01背包问题,并输出最大价值。
阅读全文