您的位置:首页 > 其它

Poj 1384 & Hdu 1114 Piggy-Bank (完全背包)

2013-02-24 20:51 411 查看
题目链接:http://poj.org/problem?id=1384

题意:给你一个储蓄罐空的和满的重量E、F,然后给出各种硬币的价值P和对应的重量W,要你估计出储蓄罐里面硬币价值和最小为多少,注意要保证重量和恰好为给出满的重量。1<=N<=500,1 <= E <= F <= 10000。

思路:完全背包,因为是求最小值且必须装满,故f[0]初始化为0,数组其他部分为正无穷。

注意正无穷不要习惯性写成0x7fffffff,代码中标记处执行加运算后会变负数。

#include <cstdio>
#include <cstring>
#define min(x,y) ((x)<(y)?(x):(y))

struct Point
{
	int p,w;
	void get ()
	{
		scanf("%d%d",&p,&w);
	}
}p[505];

const int INF=0x0fffffff;
int f[10010];
int E,F,n;

void CompletePack ()
{
	int i;	
	for (i=0;i<=F-E;i++)
		f[i]=INF;
	f[0]=0;
	for (i=1;i<=n;i++)
		for (int j=p[i].w;j<=F-E;j++)
			f[j] = min(f[j],f[j-p[i].w]+p[i].p);    //见题解
}

int main ()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d%d%d",&E,&F,&n);
		for (int i=1;i<=n;i++)
			p[i].get();
		CompletePack ();
		if (f[F-E] == INF)
			printf("This is impossible.\n");
		else
			printf("The minimum amount of money in the piggy-bank is %d.\n",f[F-E]);		
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: