贪心算法求解背包问题
本题可以用结构体构造一个宝物的类型,包括宝物的重量,价值和性价比。
既然是贪心算法,就是要单位重量内拿的宝物价值最高
所以通过性价比对宝物进行从大到小排序,然后依次拿取就好了
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
const int M = 101;
using namespace std;
struct Treasure
{
double w; //每个宝物的重量
double v; //每个宝物的价值
double p; //性价比
} s[M];
bool cmp(Treasure a, Treasure b)
{
return a.p > b.p; //根据宝物的单位价值从大到小排序
}
int main()
{
int N, T; //N堆金币,T为背包最大载重量
cin >> N >> T;
for (int i = 0; i < N; i++) //输入宝物重量和价值
{
cin >> s[i].w >> s[i].v;
s[i].p = s[i].v / s[i].w;
}
sort(s, s + N, cmp); //按宝物单位价值从大到小排序
double sum = 0.0; //表示拿走宝物价值总和
for (int i = 0; i < N; i++)
{
if (T > s[i].w)
{
T -= s[i].w;
sum += s[i].v;
}
else
{
sum += T * s[i].p;
break; //背包装满,停止循环
}
}
printf("%.2f", sum);
return 0;
}