HDU—2955 DP—01背包

来源:互联网 发布:雪岚数据查询网 编辑:程序博客网 时间:2024/06/05 22:33

题意是:

小偷去银行偷钱,给你最大被抓的概率P 和银行的个数N。

接下来N行 每行两个数字,第一个数字表示该银行有M钱,第二个是被抓的概率。

所以容易得到 dp[j]=max( dp[j] , dp[j-m[i]]*p[i] );

dp[j]表示偷到 j 钱时不被抓的概率


#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <map>using namespace std;#define max(a,b) a>b?a:bint main(){freopen("in.in","r",stdin);int T;while(scanf("%d",&T)!=EOF){int m[110],px,N;double p[110],x;scanf("%lf %d",&x,&N);int sum=0;for(int i=1;i<=N;i++){scanf("%d %lf",&m[i],&p[i]);p[i]=1-p[i];sum+=m[i];}double dp[10010];for(int i=0;i<10010;i++) dp[i]=0;dp[0]=1;for(int i=1;i<=N;i++){for(int j=sum;j>=m[i];j--){                    dp[j]=max(dp[j],dp[j-m[i]]*p[i]);}}for(int i=sum;i>=0;i--){if(dp[i]>1-x)                {                    printf("%d\n",i);break;                }}}return 0;}


0 0
原创粉丝点击