题意: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