码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 2955 Robberies->0-1背包问题

时间:2015-03-14 18:35:13      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:acm   c++   编程   算法   背包   

题意: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背包问题

标签:acm   c++   编程   算法   背包   

原文地址:http://blog.csdn.net/a809146548/article/details/44261425

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!