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;
}