首页 > 代码库 > 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背包)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。