典型背包,贪心做法。 对J/F进行由大到小排序,然后装包。剩下的多余的食物按百分比再装~ #include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; typedef struct { double v; int j,f; }Bean; Bean bean[1005]; int cmp( Bean x,Bean y ) { if( x.v >= y.v ) return 1; else return 0; } int main(void) { int m,n,i; while( scanf("%d%d",&m,&n) && m != -1 ) { for(i=0; i<n; i++) { scanf("%d %d",&bean[i].j,&bean[i].f); bean[i].v = (double)bean[i].j/bean[i].f; } sort(bean,bean+n,cmp); double sumbean = 0,sumfood = 0; for(i=0; i<n; i++) { sumbean += bean[i].j; sumfood += bean[i].f; if( sumfood > m ) { sumfood -= bean[i].f; sumbean -= bean[i].j; break; } } if( i!= n ) { sumbean += (m-sumfood)/bean[i].f*bean[i].j; printf("%.3lf/n",sumbean); } else printf("%.3lf/n",sumbean); } return 0; }