随笔-65  评论-6  文章-0  trackbacks-0
 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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理