有一个背包的容量为C,有n个物品,每个物品的重量为w1,w2,...wn,每个物品的价值为v1,v2,v3...vn,装入哪些物品使背包中的物品价值最大。通过键盘输入背包的容量,物品的个数以及每个物品的重量和价值,使用贪心算法求出装入背包的中的物品价值的最大值。C语言
时间: 2023-12-02 19:24:19 浏览: 44
0-1背包问题_.java给定背包的容量c,物品数量n、物品重量的集合w[n]和物品价值的集合
5星 · 资源好评率100%
实现如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int weight;
int value;
float ratio;
} Item;
int cmp(const void *a, const void *b) {
Item *ia = (Item *)a;
Item *ib = (Item *)b;
return (int)(ib->ratio - ia->ratio);
}
int main() {
int capacity, n;
printf("请输入背包的容量:");
scanf("%d", &capacity);
printf("请输入物品的个数:");
scanf("%d", &n);
Item *items = (Item *)malloc(sizeof(Item) * n);
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个物品的重量和价值,以空格分隔:", i + 1);
scanf("%d%d", &items[i].weight, &items[i].value);
items[i].ratio = 1.0 * items[i].value / items[i].weight;
}
qsort(items, n, sizeof(Item), cmp);
int max_value = 0;
for (int i = 0; i < n && capacity > 0; i++) {
if (capacity >= items[i].weight) {
max_value += items[i].value;
capacity -= items[i].weight;
} else {
max_value += capacity * items[i].ratio;
capacity = 0;
}
}
printf("最大价值为:%d\n", max_value);
free(items);
return 0;
}
阅读全文