hdu 2955 (简单dp)

来源:互联网 发布:淘宝客关键词选择 编辑:程序博客网 时间:2024/05/29 02:11


题意:某个人去抢银行 但是有一个概率p  如果被抓的概率小于p  它的妈妈才会同意他去抢银行 有n个银行  每个银行的钱和被抓的概率
让你计算他可以在不被抓的情况下抢到的最大money


思路: 简单dp   需要钱的最大数目  就是算出它抢多少钱时候的被抓可能性  如果不被抓 抢到的钱多的话就是这个答案
状态转移方程:dp[j]=max(dp[j],dp[j-money[i]]*(1-p[i]) 可以减去money[i]  说明有足够的钱  抢了i银行  就有不被抓的可能性。 初始化dp[0]=1;

#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int maxn=101;const int maxv=10005;float dp[maxv];  //求最大的不被抓概率float p; //被抓的概率要<=pint n;int sum;  //银行的总钱数int money[maxn];float prob[maxn];int main(){    int t,val;    float pj;    scanf("%d",&t);    while(t--){        scanf("%f%d",&p,&n);        sum=0;        for(int i=1;i<=n;i++){            scanf("%d%f",&val,&pj);            sum+=val;            money[i]=val;  //将银行里的钱当成容量            prob[i]=1-pj;   //将不被抓的可能性当成价值        }        memset(dp,0,sizeof(dp));        dp[0]=1;        for(int i=1;i<=n;i++){            for(int j=sum;j>=money[i];j--){                dp[j]=max(dp[j],dp[j-money[i]]*prob[i]);//也就是之前抢劫过money[i]  所以有个不被抓的概率            }        }        int ans=0; //别忘了初始为0        for(int i=sum;i>=1;i--){            if(dp[i]>=1-p){                ans=i;                break;            }        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击