HDU:2955 Robberies

背包的变形。

需要变化一下思维,dp[i][j]表示在前i个银行抢到j钱时不被抓到的最大概率。答案是小于P时,j的最大值。

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <stack>
#include <algorithm>
#define MAXN 1000005
#define MOD 1000000007
#define INF 1000000
#define ll long long
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        double t;
        int n;
        scanf("%lf%d",&t,&n);
        double p[105];
        int w[105];
        for(int i=0; i<n; ++i)
            scanf("%d%lf",&w[i],&p[i]);
        int sum=0;
        for(int i=0; i<n; ++i)
            sum+=w[i];
        double dp[10005]={0};
        dp[0]=1;
        for(int i=0; i<n; ++i)
            for(int j=sum; j>=w[i]; --j)
                dp[j]=max(dp[j-w[i]]*(1-p[i]),dp[j]);
        int ans=0;
        t=1-t;
        for(int i=0; i<=sum; ++i)
            if(dp[i]>=t)
                ans=max(ans,i);
        printf("%d\n",ans);
    }
    return 0;
}


 

你可能感兴趣的:(动态规划,背包问题)