【深基12.例1】部分背包问题

https://www.luogu.com.cn/problem/P2240

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, t;
 4 struct jb{ //金币结构体 
 5     int m, v;//重量,价值 
 6 };
 7 jb a[105];//用于存储n 堆金币 
 8 double ans;//记录答案可以拿走金币总价值 
 9 bool cmp(jb x, jb y){//排序参数设定:单位重量金币价值 
10     return x.v*1.0/x.m > y.v*1.0/y.m;//注意数据类型的转换 
11 }
12 int main()
13 {
14     cin>>n>>t;
15     for(int i=0; i<n; i++)     //输入n堆金币 
16         cin>>a[i].m>>a[i].v;
17     sort(a, a+n, cmp);         //按单位重量金币价值从大到小排序    
18     for(int i=0; i<n; i++){
19         if(t>=a[i].m){         //背包剩余重量 和 当前堆金币重量比较 
20             ans+=a[i].v*1.0;
21             t-=a[i].m;
22         }
23         else{                 //背包剩余量装不下时,分割金币装包 
24             ans+=a[i].v*1.0/a[i].m*t;
25             t=0;
26         }
27         if(t==0)break;        //背包剩余量为 0时结束装包 
28     }
29     cout<<fixed<<setprecision(2)<<ans;
30     return 0;
31  } 

 

posted @ 2020-07-22 17:56  TFLSNOI  阅读(199)  评论(0编辑  收藏  举报