Little Tiger vs. Deep Monkey(hdu4815)01背包
题:http://acm.hdu.edu.cn/showproblem.php?pid=4815
题意:已知n个题以及每个题答对的得分,给出p概率
小老虎vs小猴子答题;已知小猴子随机答题,请问老虎至少得多少分
才可以保证有p概率不会输
样例中老虎和猴子得分的八种情况如下
m-n表示老虎得分:猴子得分
分母 2^n(所以把总的算出来当分母,分子就是这个分值有几种选法+之前的)
猴子分数:该分数出现情况次数
所以先01背包算出刚好组成k分数的方案数
然后累加 得出老虎在k分数的情况下 猴子分数<=老虎分数的方案数
该方案数就是分子;分母是2^n
然后和p比较即可
#include<bits/stdc++.h> using namespace std; #define ll long long int n; double p; ll dp[40005]; int s[45]; int main() { int t,i; scanf("%d",&t); while(t--){ scanf("%d%lf",&n,&p); ll grade=0; for(i=0;i<n;i++){ scanf("%d",&s[i]); grade+=s[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(i=0;i<n;i++){ for(int j=grade;j>=s[i];j--){ dp[j]+=dp[j-s[i]];//组成j分的方案数 } } //for(i=0;i<=grade;i++)cout<<dp[i]<<endl; ll cnt=0; ll sum=1LL<<n; // 分数的总方案数; for(int i=0;i<=grade;i++){ cnt+=dp[i];//老虎在i分数的情况下 猴子分数<=老虎分数的方案数 if((cnt*1.0/sum)>=p){ printf("%d\n",i); break; } } } return 0; }