分析:最大录取概率=1-最小不录取概率。
0-1背包求出最小不录取概率,然后用1减去即可。
注意dp数组初始化时概率要先设置为1,表示一开始被录取。
#include<iostream>
using namespace std;
double p[10001],dp[10001];
int v[10001];
int main()
{
int n,m,i,j;
while(cin>>n>>m &&(n||m))
{
for(i=0;i<m;i++)
{
cin>>v[i]>>p[i]; //p[i]为录取的概率
p[i]=1-p[i]; //1-p[i]为不被录取的概率
}
for(i=0;i<=n;i++)
dp[i]=1.0f; //开始初始化为1.0f,表示被录取
for(i=0;i<m;i++)
for(j=n;j>=v[i];j--)
if(dp[j]>dp[j-v[i]]*p[i])
dp[j]=dp[j-v[i]]*p[i];
printf("%.1lf%%\n",(1.0f-dp[n])*100);
}
return 0;
}HDU ACM 1203 I NEED A OFFER!->背包问题
原文地址:http://blog.csdn.net/a809146548/article/details/45248907