简单的部分背包问题,相除排序然后取
#include<stdio.h>
#include<stdlib.h>
struct doors{
float java;
float fat;
double result;
}dor[1005];
int cmp(const void *a,const void *b){
return ((struct doors *)b)->result > ((struct doors *)a)->result ? 1 : -1;
}
int main(void){
int m, n, i, j;
double sum;
while( scanf("%d%d", &m, &n), m != -1 || n != -1){
for( i = 0; i < n; i++){
scanf("%f%f", &dor[i].java, &dor[i].fat);
dor[i].result = dor[i].java * 1.0 / dor[i].fat; //这里有一个问题,如果不乘1.0话就WA,可是明明是浮点数相除啊
}
qsort( dor,n,sizeof(struct doors),cmp);
sum = 0;
for( i = 0; i < n; i++){
if( m < dor[i].fat){
sum += dor[i].result * m;
break;
}
else{
sum += dor[i].java;
m -= dor[i].fat;
}
}
printf("%.3lf\n", sum);
}
return 0;
}