3023
Problem W
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 65 Accepted Submission(s) : 24
10 3 4 0.1 4 0.2 5 0.3 0 0
44.0% <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div> You should use printf("%%") to print a '%'. </div>
申请不同的学校有不同的可能性,他只有N万美元。求他获得offer的最大的概率;
思路:
要求他至少能拿到一份的最大概率,需要分类讨论;
但是如果把问题转换成求最小的概率,那么就只剩下一种情况。可以避免讨论不同的情境的问题;
dp[j]=min(dp[j],dp[j-a[i]]*(1.0–b[i]));
求出来之后,用1减去即可;
#include<stdio.h>
double dp[10005],p[10005];
int a[10005];
int main()
{
int n,i,j,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0)
break;
for(i=0;i<m;i++)
{
scanf("%d%lf",&a[i],&p[i]);
p[i]=1-p[i]; //不能得到Offer的概率
}
for(i=0;i<=n;i++)
dp[i]=1.0; //初始化为1
for(i=0;i<m;i++)
for(j=n;j>=a[i];j--)
if(dp[j]>dp[j-a[i]]*p[i])
dp[j]=dp[j-a[i]]*p[i];//求最小的不能得到的dp[n]
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}