#include <bits/stdc++.h>
using namespace std;
struct Node {
//物品的重量,价值,单位价值,取值比例
double w, v, signalValue, prop;
int id;//编号
};
bool cmp(Node a, Node b) {
return a.signalValue > b.signalValue;
}
bool cmp1(Node a, Node b) {
return a.id < b.id;
}
int main() {
int n;
double maxWeight;
//物品数量,背包最大重量
scanf("%d%lf", &n, &maxWeight);
Node obj[n];
//录入数据
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &obj[i].w, &obj[i].v);
obj[i].signalValue = obj[i].v / obj[i].w;
obj[i].id = i;
obj[i].prop = 0;
}
sort(obj, obj + n, cmp);
//背包当前已经存储的重量和积累价值
double nowW = 0, nowV = 0;
for (int i = 0; i < n; i++) {
//前面已经按物品的单位价值从大到小排序
//遍历每件物品
//当前背包容量可以装下当前物品
if (maxWeight >= obj[i].w) {
obj[i].prop = 1;
maxWeight -= obj[i].w;
nowW += obj[i].w;
nowV += obj[i].v;
} else {
//当前背包容量不能把当前物品全部装下
nowV += obj[i].signalValue * maxWeight;
nowW += maxWeight;
obj[i].prop = maxWeight / obj[i].w;
maxWeight = 0;
}
}
printf("当前背包重量: %.2f\n当前背包价值: %.2f\n", nowW, nowV);
//打印每件物品的取值比例
sort(obj, obj + n, cmp1);
for (int i = 0; i < n; i++)
printf("第%d件物品取值: %.4f\n", i + 1, obj[i].prop);
return 0;
}
背包问题,贪心法
最新推荐文章于 2022-04-12 17:28:02 发布