题意:
抢劫银行!!!
每个银行都有那么几块钱。并且总是有被抓住的风险型。
询问在风险性小于p的前提下,可以最多抢到多少钱
思路:
dp[i]保存的是在抢劫i块钱的情况下,最大的安全概率。
dp[0]=1
这样在递推时候 就可以得到dp[j]= dp[j-val] *(1-w) 表示在dp[j-val]转移的安全的条件下,此步仍然安全的概率。
之后从后向前找在安全的概率下最大钱数即可
此题和 一样
HDU 2955 | Robberies 01背包 |
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn=10005;
double dp[maxn];
int val[maxn];
double w[maxn];
int main()
{
int t;
scanf("%d",&t);
for(int cs=1;cs<=t;cs++)
{
double p;
int n;
scanf("%lf%d",&p,&n);
memset(dp,0,sizeof(dp));
dp[0]=1;
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%lf",&val[i],&w[i]);
sum+=val[i];
}
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=val[i];j--)
{
dp[j]=max( dp[j],dp[j-val[i]]*(1-w[i]) );
}
}
printf("Case %d: ",cs);
for(int i=sum;i>=0;i--)
{
if(dp[i]>1-p)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}