题意:Roy想要抢劫银行,每家银行都有一定的金额和被抓到的概率,知道Roy被抓的最大概率P,求Roy在被抓的情况下,抢劫最多。
分析:
1、可以把各个银行的钱数加起来得到总钱数,进而看成背包的容量。
2、各个银行的钱看作重量。
3、不被抓的概率看作价值,注意这里用乘而不是加。
4、因此有状态转移方程:dp[j]=dp[j]>dp[j-mj[i]]*(1-pj[i])?dp[j]:dp[j-mj[i]]*(1-pj[i]);
#include<iostream>
using namespace std;
int main()
{
int T,n,i,j;
double p,sum;
int mj[101];
double pj[102],dp[10001];
cin>>T;
while(T--)
{
cin>>p>>n;
sum=0;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
cin>>mj[i]>>pj[i];
sum+=mj[i]; //累加每家银行的钱数,得到总钱数
}
dp[0]=1; //一开始不被抓的概率为1,
for(i=0;i<n;i++)
for(j=sum;j>=mj[i];j--)
dp[j]=dp[j]>dp[j-mj[i]]*(1-pj[i])?dp[j]:dp[j-mj[i]]*(1-pj[i]);
for(i=sum;i>=0;i--)
if(dp[i]>1-p)
{
cout<<i<<endl;
break;
}
}
return 0;
}HDU ACM 2955 Robberies->0-1背包问题
原文地址:http://blog.csdn.net/a809146548/article/details/44261425