一个商人带着一个能装m千克的背包取乡下收购货物,准备将这些货物卖到城里获利。现有n种货源,且知第i种货物有wi(i是下标)千克,可获利pi(i是下标)元,请编写算法帮助商人收购货物,以获取最高的利润(请使用贪婪算法设计)c语言编写
时间: 2024-11-15 15:29:08 浏览: 7
为了使用贪婪算法解决这个问题,我们可以按照每种货物单位重量的利润(即价格除以重量的比例pi/wi)从高到低排序。然后,依次将价值最大的货物加入背包,直到达到背包容量m为止。这是因为在每一步中,我们都选择当前最优的选择,希望能最大化总利润。
以下是使用C语言实现的简单版本,假设数组`profits`存储了每个货物的利润,`weights`存储了它们的重量:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义货物结构体
typedef struct {
int weight;
int profit;
} Item;
// 比较函数,用于对货物按照单位重量利润降序排列
int compare_items(const void *a, const void *b) {
Item *item_a = (Item *)a;
Item *item_b = (Item *)b;
return item_b->profit / item_b->weight - item_a->profit / item_a->weight;
}
int main() {
int m, n;
printf("Enter the maximum weight of the backpack (m): ");
scanf("%d", &m);
// 获取货物信息
printf("Enter the number of items (n): ");
scanf("%d", &n);
Item items[n];
for (int i = 0; i < n; ++i) {
printf("Weight and profit of item %d: ", i + 1);
scanf("%d %d", &items[i].weight, &items[i].profit);
}
// 对货物按单位利润降序排序
qsort(items, n, sizeof(Item), compare_items);
// 初始化总利润
int total_profit = 0;
// 背包剩余空间
int remaining_weight = m;
// 遍历并选择最高利润的商品
for (int i = 0; i < n && remaining_weight > 0; ++i) {
if (items[i].weight <= remaining_weight) {
total_profit += items[i].profit;
remaining_weight -= items[i].weight;
} else {
total_profit += items[i].profit * (remaining_weight / items[i].weight);
break; // 如果还有空间,就放满;若不够,则停止填充
}
}
printf("The maximum profit is: %d\n", total_profit);
return 0;
}
```
阅读全文