HDU1009 FatMouse' Trade

 

http://acm.hdu.edu.cn/showproblem.php?pid=1009

 

解题思路:这道题是部分背包问题,我们只要用贪心算法来做。根据J[i]/F[i]的值,由大到小排序,如果M大于F[i],则全部对换,否则就对换能兑换的部分J[i]。

 

#include <cstdio> #include <iostream> #include <algorithm> using namespace std; struct data { int j,f; double res; }a[3001]; bool cmp(data a,data b) { return a.res>b.res; } int main() { int N,M,i; double sum; while (scanf("%d%d",&M,&N)!=EOF) { if(M==-1&&N==-1) break; for (i=0;i<N;i++) { scanf("%d%d",&a[i].j,&a[i].f); a[i].res = (double)a[i].j/a[i].f; } sort(a,a+N,cmp); i=0; sum = 0; for(i=0;i<N;i++) { if(M>a[i].f) { sum+=a[i].j; M-=a[i].f; } else { sum+=a[i].res*M; M = 0; break; } } printf("%.3lf/n",sum); } return 0; }

 

你可能感兴趣的:(HDU1009 FatMouse' Trade)