题意:Speakless,给定他所攒的钱n,若干个学校的申请费用和可能拿到offer的概率。求Speakless可能得到至少一份offer的最大概率。
这个问题就和hdu2955差不多,dp里面储存至少一份offer的最大概率,求的时候先转化成拿不到概率相乘,在用1减去。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=10010; 5 double dp[maxn],value[maxn]; 6 int cost[maxn]; 7 8 int main(){ 9 int m,n; 10 while(scanf("%d %d",&m,&n)!=EOF){ 11 if(m==0&&n==0) break; 12 for(int i=1;i<=n;i++){ 13 scanf("%d %lf",&cost[i],&value[i]); 14 } 15 memset(dp,0,sizeof(dp));//初始化 16 for(int i=1;i<=n;i++){ 17 for(int j=m;j>=cost[i];j--){ 18 dp[j]=max(dp[j],1-((1-dp[j-cost[i]])*(1-value[i])));//求概率,先转化成拿不到的概率再用1减去m,dp里面就储存至少一份offer的最大概率 19 } 20 } 21 printf("%.1f%%\n",dp[m]*100); 22 } 23 return 0; 24 }
时间: 2024-12-09 11:11:07