题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N \le 100)N(N≤100) 堆金币,第 ii 堆金币的总重量和总价值分别是 m_i,v_i(1\le m_i,v_i \le 100)mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为 T(T \le 1000)T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入格式
第一行两个整数 N,TN,T。
接下来 NN 行,每行两个整数 m_i,v_imi,vi。
输出格式
一个实数表示答案,输出两位小数
输入输出样例
输入 #14 50 10 60 20 100 30 120 15 45输出 #1
240.00
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct gold{ 4 int m; //重量 5 int v; //总价值 6 double price; //单价 7 }g[1000]; 8 bool cmp(gold a,gold b){ 9 return a.price>b.price; 10 }; 11 int main(){ //P2240 【深基12.例1】部分背包问题 12 int n; //n堆金币 13 int t; //承重量为 t 的背包 14 double total=0; //背包里已经装进去的东西的最大价值 15 cin>>n>>t; 16 for(int i=0;i<n;i++){ 17 cin>>g[i].m>>g[i].v; 18 g[i].price=g[i].v*1.0/g[i].m; 19 } 20 sort(g,g+n,cmp); 21 int i=0; 22 while(t){ 23 24 if(g[i].m<=t){ 25 t-=g[i].m; 26 total+=g[i].v; 27 }else{ 28 total+=g[i].price*t; 29 break; 30 } 31 i++; 32 if(i==n) break; //如果金子装完了背包依然没装满,跳出 33 } 34 cout<<fixed<<setprecision(2)<<total; 35 return 0; 36 }
标签:12,int,深基,P2240,金币,le,背包,100 From: https://www.cnblogs.com/geyang/p/16841543.html