杭电1203

题意:某穷人有n万美元申请m个学校,给出申请每个学校费用及拿到offer的概率,求起码得到一个offer的最大概率。

Analyse:这是一个01背包问题。要求的是一个offer都拿不到的最小概率,f[i][j]=min{f[i-1][j],f[i-1][j-cost[i]]*fail_prob[i]}。

View Code
 1 #include<cstdio>
 2 typedef struct
 3 {
 4     int cost;
 5     double prob;
 6 }school;
 7 double f[10010];
 8 school a[10010];
 9 int main()
10 {
11     int n,m;
12     int i,j;
13     double min;
14     while(scanf("%d%d",&n,&m) && (n || m))
15     {
16         for(i=0;i<m;i++)
17         {
18             scanf("%d%lf",&a[i].cost,&a[i].prob);
19             a[i].prob=1-a[i].prob;
20         }
21         for(j=0;j<=n;j++)
22             f[j]=1;
23         for(i=0;i<m;i++)
24         {
25             for(j=n;j>=a[i].cost;j--)
26                 if(f[j]>f[j-a[i].cost]*a[i].prob)
27                     f[j]=f[j-a[i].cost]*a[i].prob;
28         }
29         printf("%.1lf%%\n",100-f[n]*100);
30     }
31     return 0;
32 }

 

还可以转换成对数log10(fail_prob[i])后计算对数的和的最小值。

View Code
 1 #include<cstdio>
 2 typedef struct
 3 {
 4     int cost;
 5     double prob;
 6 }school;
 7 double f[10010];
 8 school a[10010];
 9 int main()
10 {
11     int n,m;
12     int i,j;
13     double min;
14     while(scanf("%d%d",&n,&m) && (n || m))
15     {
16         for(i=0;i<m;i++)
17         {
18             scanf("%d%lf",&a[i].cost,&a[i].prob);
19             a[i].prob=1-a[i].prob;
20         }
21         for(j=0;j<=n;j++)
22             f[j]=1;
23         for(i=0;i<m;i++)
24         {
25             for(j=n;j>=a[i].cost;j--)
26                 if(f[j]>f[j-a[i].cost]*a[i].prob)
27                     f[j]=f[j-a[i].cost]*a[i].prob;
28         }
29         printf("%.1lf%%\n",100-f[n]*100);
30     }
31     return 0;
32 }

 

posted @ 2012-08-29 21:47  Hogg  阅读(334)  评论(0)    收藏  举报