HDU 2955

//考察点:会不会使用dp
//思路:一开始脑残了,以为是概率相加。。。正确的题意是,强盗抢完银行被捕的概率小于给定的值
//我们拿第一个例子来说,不能抢第一个和第二个银行的原因是,1-(1-0.02)*(1-0.03)>0.04,故不符合题意
//因此,本题中,我们应该把每个银行的存款加在一起,作为背包的总重量,不过对应概率要转化成逃跑
//概率。还拿第一个例子来说,0.98*0.97表示可以逃跑的概率,必须使得逃跑概率>0.96才满足题意。我们
//可以求出所有逃跑的概率,然后判断是否大于给定的逃跑的概率。

//提交情况:wa1次,for(int v=sum;v>=0;v--)处用于输出结果的时候,v是能够等于0的,因为可能哪个银行
//都不能强

//收获:学会自己构造满足背包的条件
//经验:要关注细节,例如等于零的情况,要想清楚。
//AC code
#include<iostream>
using namespace std;

int n;
double dp[100*100+5];
double weight[105];
int cost[105];
int k,sum;
double pb;

int main(){
	cin>>n;
	while(n--){
		cin>>pb>>k;
		sum=0;
		for(int i=1;i<=k;i++){
			cin>>cost[i]>>weight[i];
			sum+=cost[i];
		}
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(int i=1;i<=k;i++){
			for(int v=sum;v>=cost[i];v--){
				dp[v]=max(dp[v],dp[v-cost[i]]*(1-weight[i]));
			}
		}
		for(int v=sum;v>=0;v--){
			if(dp[v]>=(1-pb)){
				cout<<v<<endl;
				break;
			}
		}
	}
	return 0;
}

你可能感兴趣的:(HDU 2955)