P2240 部分背包问题
题目链接:P2240
解题思路:
计算出每堆金币的单位价值(总价值除以总质量),然后每次尽可能取单位价值最大的。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int n,t; 6 double sum; 7 struct node 8 { 9 int m,v; 10 double w; 11 bool operator < (const node &b) const 12 { 13 return w > b.w; 14 } 15 } a[110]; 16 int main() 17 { 18 sum = 0; 19 cin >> n >> t; 20 for(int i = 0; i < n; i++) 21 { 22 cin >> a[i].m >> a[i].v; 23 a[i].w = a[i].v*1.0/a[i].m; 24 } 25 sort(a,a+n); 26 for(int i = 0; i < n; i++) 27 { 28 if(t == 0) break; 29 if(a[i].m <= t) // 如果能全拿,就全拿 30 { 31 t -= a[i].m; 32 sum += a[i].w*a[i].m; 33 } else if(a[i].m > t) { // 全拿不了,能拿多少拿多少 34 sum += a[i].w*t; 35 t = 0; 36 } 37 } 38 printf("%.2f",sum); 39 return 0; 40 }

浙公网安备 33010602011771号