練習三 1022

概述:小偷偷東西,給出他被抓的機率,求他能偷到的最大財富。

思路:既然是最大財富,那就是當他正好被抓到時,錢最多,在將被抓概率轉化爲存活概率,利用概率相乘原理,轉化爲01揹包問題(怎麼又是01揹包)即可。

感想:無。

#include <stdio.h>
#include <algorithm>
using namespace std;

struct Bank
{
	int mom;
	double p;
} Bank[10005];

int main()
{
	int n, t;
	double p;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%lf%d", &p, &n);
		p = 1 - p;
		int i, j, sum = 0;
		for (i = 0; i<n; i++)
		{
			scanf("%d%lf", &Bank[i].mom, &Bank[i].p);
			Bank[i].p = 1 - Bank[i].p;
			sum += Bank[i].mom;
		}
		double dp[10005] = { 1.0 };
		for (i = 0; i<n; i++)
		{
			for (j = sum; j >= Bank[i].mom; j--)
			{
				dp[j] = max(dp[j], dp[j - Bank[i].mom] * Bank[i].p);
			}
		}
		for (i = sum; i >= 0; i--)
		{
			if (dp[i] - p>0.000000001)
			{
				printf("%d\n", i);
				break;
			}
		}
	}

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章