hdu4815----dp0-1背包
/* 题目大意: 有n个问题,,告诉你答对该题能得多少分,其中一个人随机答题,问另一个人不输的概率为p 至少需要答多多少分 对于样例: 3 0.5 1 2 3 分析: 分数 0 1 2 3 3 4 5 6 次数 1 1 1 2 1 1 1 1 位置 1 2 3 4 5 6 7 8 不输的概率为0.5 那么对应的位置为0.5*2^n=0.5*8=5 因此对应的分数是3 */ #include <iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long long #define MAX 40000+5 int n,a[MAX]; double p; int dp[MAX];//dp[i]代表分数i出现的次数 int main() { freopen("in.txt","r",stdin); int T; cin>>T; while(T--) { scanf("%d%lf",&n,&p); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); dp[0]=1; for(int i=1;i<=n;i++) for(int j=MAX;j>=a[i];j--)//从大到小,不然就重复更新了,因为是用小的更新大的 dp[j] += dp[j-a[i]]; LL sum = 1LL<<n;//注意1LL否则爆int LL cnt = sum*p; if(sum*p-cnt) cnt+=1; LL num=0; for(int j=0;j<MAX;j++) { num+=dp[j]; if(num>=cnt) { printf("%d\n",j); break; } } } return 0; }