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
",i);
                break;
            }
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/ydw--/p/11692628.html