首页 > 代码库 > HDU - 1203 I NEED A OFFER!(01背包)

HDU - 1203 I NEED A OFFER!(01背包)

题意: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 }

 

HDU - 1203 I NEED A OFFER!(01背包)