贪心算法之背包问题

#include <iostream>
#include <algorithm>
using namespace std;

const int M=1000005;
struct three{
    double w;//每个宝物的重量
    double v;//每个宝物的价值
    double p;;//性价比
}s[M];

bool cmp(three a, three b)
{
    return a.p>b.p;//根据宝物的单位价值从大到小排序
}

int main()
{
    int n;//n 表示有n个宝物
    double m;//m 表示毛驴的承载能力
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>s[i].w>>s[i].v;
        s[i].p=s[i].w/s[i].w;//每个宝物单位价值
    }
    sort(s,s+n,cmp);
    double sum =0.0;// sum 表示贪心记录运走宝物的价值之和
    for(int i=0;i<n;i++)//按照排好的顺序贪心
    {
        if(m>s[i].w)//如果宝物的重量小于毛驴剩下的承载能力
        {
            m-=s[i].w;
            sum+=s[i].v;
        }
        else{//如果宝物的重量大于毛驴剩下的承载能力
            sum+=m*s[i].p;
            break;
        }
    }
    cout<<sum<<endl;//输出装入宝物的最大价值
    return 0;
}
无欲则刚 关心则乱
原文地址:https://www.cnblogs.com/xjyxp/p/11140832.html