1 /*
2 Author: Leo.W
3 Descriptipn:典型的01背包问题,对输入的每组数据【花费及可能性】进行背包判断,
4 得到在花费总和是经济能力范围内的累计获offer几率最大的组合。
5 How to Do:f[V]=max{f[V],f[V-c[i]]+w[i]};
6 【前后f[V]分别表示前i个大学申请在总花费为V时的最大几率和前i-1个大学申请在总花费为V时的最大几率;
7 f[V-c[i]]表示前i-1个大学在总花费为V-c[i]时的最大几率,
8 c[i]表示第i个大学申请的花费,w[i]则表示第i个大学申请成功的几率】
9 */
10 #include <iostream>
11 #include <string.h>
12 using namespace std;
13 double f[100010];
14 int c[1010];
15 double w[1010];
16 int main(){
17 //freopen("in.txt","r",stdin);
18 int n,m;
19 int i,j;
20 while(scanf("%d%d",&n,&m),m||n){
21 for(i=0;i<m;i++){
22 scanf("%d%lf",&c[i],&w[i]);
23 }
24 memset(f,0.0,sizeof(f));
25 for(i=0;i<m;i++){
26 for(j=n;j>=c[i];j--){//比较是鉴于概率论的知识
27 f[j]=f[j]>(1-(1-f[j-c[i]])*(1-w[i]))?f[j]:(1-(1-f[j-c[i]])*(1-w[i]));
28 }
29 }
30 double sum=f[n]*100;
31 printf("%.1lf%%\n",sum);
32 }
33 return 0;
34 }
35
posted on 2012-03-02 23:59
Leo.W 阅读(252)
评论(0) 编辑 收藏 引用