洛谷 P2240 部分背包问题

原题链接

image

题解

这道题是贪心
只要按照性价比最高的取一定得到的价值最大
性价比就是这堆金币的价值除以重量
只需要把这些金币按性价比排序就行了
最后在超出和未超出之间,按比例放入金币即可

#include "iostream"
#include "algorithm"
#include "iomanip"
#include "vector"
using namespace std;
struct node{
    double w;
    double p;
}coin[100];
int main(){
    int n,total,sum=0;
    double ans=0;
    cin>>n>>total;
    for(int i = 0; i < n; i++){
        cin>>coin[i].w>>coin[i].p;
    }
    sort(coin,coin+n,[](node o,node l)->bool{
        return o.p/o.w>l.p/l.w;
    });
    for(int i=0;i<n;i++){
        if(sum+coin[i].w<=total){
            sum+=(int)coin[i].w;
            ans+=coin[i].p;
        }
        else {
            ans+=(total-sum)*(coin[i].p/coin[i].w);
            break;
        }
    }
    cout<<fixed<<setprecision(2)<<ans;
}
posted @ 2023-02-11 11:49  Cheng_Mao  阅读(25)  评论(0)    收藏  举报