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

题目描述

阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N \le 100)N(N100) 堆金币,第 ii 堆金币的总重量和总价值分别是 m_i,v_i(1\le m_i,v_i \le 100)mi,vi(1mi,vi100)。阿里巴巴有一个承重量为 T(T \le 1000)T(T1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?

输入格式

第一行两个整数 N,TN,T。

接下来 NN 行,每行两个整数 m_i,v_imi,vi

输出格式

一个实数表示答案,输出两位小数

输入输出样例

输入 #1
4 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 }

 

posted @ 2022-10-30 16:18  葛杨杨  阅读(97)  评论(0编辑  收藏  举报