先排序,按成功率从大到小,若成功率相同就俺花费从小到大排
从第一个开始循环,每刚好不超过总费用的几个学校为一组,求得概率
#include "stdio.h"
typedef struct _Schl{
int cost;
double pro;
}Schl;
void main(){
int n;
int money;
Schl school[1001];
Schl t;
int i, j;
int cost;
double pro, mx;
freopen("in.txt", "r", stdin);
while(scanf("%d %d", &money, &n), money+n){
for(i=0; i<n; i++){
scanf("%d %lf", &(school[i].cost), &(school[i].pro));
t = school[i];
for(j=i-1; j>=0; j--){
if(school[j].pro < t.pro)
school[j+1] = school[j];
else if(school[j].pro > t.pro)
break;
else{
if(school[j].cost > t.cost)
school[j+1] = school[j];
else
break;
}
}
school[j+1] = t;
}
mx = 0.0;
for(i=0; i<n; i++){
cost = 0;
pro = 1.0;
for(j=0; ;j++){
if(cost + school[i+j].cost > money)
break;
cost += school[i+j].cost;
pro *= 1-school[i+j].pro;
}
if(j && mx < 1-pro)
mx = 1-pro;
}
printf("%.1lf%%\n", mx*100);
}
}
其他方法:动态规划 背包