1023 Problem W

1023 Problem W

题意:Speakless很早就想出国,要申请国外的任何大学,你都要交纳一定的申请费用,Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到这个学校offer的可能性b。不同学校之间是否得到offer不会互相影响。计算一下,他可以收到至少一份offer的最大概率。

思路:已知总钱数,以及申请费和录取概率,求至少得到一份录取通知书的最大概率,此题为0-1背包的另一种形式。可得等式dp[j]=min{dp[j],dp[j-a[i]]*b[i]}。

感想:因为要求至少获得一份通知书的概率,所以可以将问题转换为对其对立情况的求解,这样问题会简化许多。

#include<iostream>

#include<stdio.h>

using namespace std;

double dp[10003];

int n,m,i,j,a[10003];

double b[10003];

int main(){

 

   while(cin>>n>>m){

       if(n==0&&m==0)

          break;

       for(i=0;i<m;i++){

           cin>>a[i]>>b[i];

           b[i]=1-b[i];

       }

       for(i=0;i<=n;i++)  dp[i]=1.0;

       for(i=0;i<m;i++)

           for(j=n;j>=a[i];j--){

                if(dp[j]>dp[j-a[i]]*b[i])

                dp[j]=dp[j-a[i]]*b[i];

           }

       printf("%.1lf%%\n",(1-dp[n])*100);

    }

   return 0;

}

你可能感兴趣的:(1023 Problem W)