HDU-2955

感觉自己好丢人...
人家一遍过的题我连加法乘法都弄错了...

概率的话用1-p计算成功概率,然后在乘法做即可最后的成功概率要大于1-p即可
这个题我自己唯一的进步就是意识到了可以用钱数作为容量,概率作为价值...说白了这个还是个01背包,不在vj上交了...

成功概率要用乘法计算!!!

背包问题不一定都是加法...

#include
#include
using namespace std;
float dp[10001];
int value[105];
float cost[105];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		float a;
		int n;
		cin>>a>>n;
		a=1-a;
	//	int v=a*1e6;
		memset(value,0,sizeof(value));
		memset(cost,0,sizeof(cost));
		memset(dp,0,sizeof(dp));
		int sum=0;
		for(int i=1;i<=n;i++)
		{
			cin>>value[i]>>cost[i];
			cost[i]=1.0-cost[i];
			sum+=value[i];
		}
		dp[0]=1;
	//	for(int i=1;i<=sum;i++)
	//		dp[i]=1.0;
		for(int i=1;i<=n;i++)
		{
			for(int j=sum;j>=value[i];j--)
			{
				dp[j]=max(dp[j],dp[j-value[i]]*cost[i]);
			}
		}
		for(int i=sum;i>=0;i--)
		{
			if(dp[i]>=a)
			{
				cout<

你可能感兴趣的:(dp)