标签:
Description
Input
Output
Sample Input
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Sample Output
题目给了每个银行的钱和被抓的概率,由于要抢尽量多的钱,所以要保证尽量不被抓,而抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之 积,我竟然把这一点给忘了!导致我走了许多弯路,思路不能太死啊!dp[]表示抢到下标所对应的钱时,此时不被抓的概率,题目给出了最终不能高于被抓概率 P,不被抓的概率就不能低于(1-P),所以最后只需要逆序遍历dp,找到第一个大于等于1-P的dp[i],就能够保证i最大,即抢到的钱最多。
/* *********************************************** Author :Mubaixu File Name :HDU2955.cpp ************************************************ */ #include<stdio.h> #include<string.h> #include<iostream> #include<queue> #include<algorithm> using namespace std; const int maxm=10005; const int maxn=105; double dp[maxm]; int value[maxn]; double tp[maxn]; int main(){ int t; int n; double p; scanf("%d",&t); while(t--){ scanf("%lf%d",&p,&n); int sum=0; for(int i=1;i<=n;i++){ scanf("%d%lf",&value[i],&tp[i]); tp[i]=1-tp[i]; sum+=value[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++){ for(int j=sum;j>=value[i];j--){ dp[j]=max(dp[j],dp[j-value[i]]*tp[i]); } } for(int i=sum;i>=0;i--){ if(dp[i]>(1-p)){ printf("%d\n",i); break; } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4983177.html