HDU 2955 Robberies (想法题&0-1背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2955


如何变形呢??

int _01pack(int n, int maxw)
{
	memset(dp, 0, sizeof(dp));
	dp[0] = 1.0;///初始化这个
	int i, j;
	for (i = 0; i < n; ++i)
		for (j = maxw; j >= w[i]; --j)///maxw为所有银行的钱的总和
			dp[j] = max(dp[j], dp[j - w[i]] * v[i]);
	for (i = maxw;; --i) if (dp[i] >= p) return i;///最后遍历下
}

完整代码:
/*109ms,312KB*/

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mx = 105;

int w[mx];
double v[mx], dp[10005], p;

int _01pack(int n, int maxw)
{
	memset(dp, 0, sizeof(dp));
	dp[0] = 1.0;
	int i, j;
	for (i = 0; i < n; ++i)
		for (j = maxw; j >= w[i]; --j)
			dp[j] = max(dp[j], dp[j - w[i]] * v[i]);
	for (i = maxw;; --i) if (dp[i] >= p) return i;
}

int main()
{
	int t, n, maxw, i;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%lf%d", &p, &n);
		p = 1.0 - p;
		maxw = 0;
		for (i = 0; i < n; ++i)
		{
			scanf("%d%lf", &w[i], &v[i]);
			maxw += w[i];
			v[i] = 1.0 - v[i];
		}
		printf("%d\n", _01pack(n, maxw));
	}
	return 0;
}

你可能感兴趣的:(C++,ACM,背包,HDU)