首页 > 代码库 > HDU4815/计数DP
HDU4815/计数DP
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4815]
简单说一下题意:
有n道题,每到题答对得分为a[ i ],假如A不输给B的最小概率是P,那么A最少要得到多少分。
解题过程:
假设有n道题,每个题有两个状态,胜或者败,假设达到某个分数m有k(计数DP)种方式,那么最后是这个分数的概率是k/pow(2,n)。那么A不输给B的概率就是小于等于m的分数的概率和。
#include<bits/stdc++.h> const int maxn = 40*1050; double dp[maxn]; int a[55]; int T,n; double p; int main () { scanf("%d",&T); while(T--) { int sum=0; scanf("%d%lf",&n,&p); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); sum += a[i]; } for(int i = 0;i <= sum;i++) dp[i]=0; dp[0]=1; for(int i = 1;i <= n;i++) for(int j = sum;j >= a[i];j--) dp[j] += dp[j-a[i]]; double nu = pow(2,n); for(int i = 0;i <= sum;i++) dp[i] /= nu; double fal = 0.0; for(int k = 0;k <= sum;k++) { fal += dp[k]; if(fal >= p) { printf("%d\n",k); break; } } } return 0; }
HDU4815/计数DP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。