hdu1114

/*

分析

    预处理+DP。

    显然是DP,而且是500*10000的。如果针对每个点都计算min的话,显然要
超时的嘛。可是最终的结果还就是由前面的点的值构建起来的,怎么办呢?
    用预处理的思想(我说的不是方法,是思想),来减少针对每个点的计算量!


    具体的看代码吧,这东西要悟的……


                                                           2012-05-08
*/





#include"stdio.h"
#include"string.h"
struct A
{
	int p;
	int w;
}E[555];
int main()
{
	int T;
	int n;
	int total;
	int temp1,temp2;
	int flag[10011];
	int i,l,k;


	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&temp1,&temp2);
		total=temp2-temp1;


		scanf("%d",&n);
		for(i=1;i<=n;i++)	scanf("%d%d",&E[i].p,&E[i].w);


		if(total==0)
		{
			printf("0\n");
			continue;
		}


		for(i=0;i<=total;i++)	flag[i]=0;
		for(i=1;i<=n;i++)
		{
			/*****/
			//遍历所有k*E[i].w的
			for(k=0;k*E[i].w<=total;k++)
			{
				if(flag[k*E[i].w]==0)				flag[k*E[i].w]=k*E[i].p;
				else if(k*E[i].p<flag[k*E[i].w])	flag[k*E[i].w]=k*E[i].p;
			}
			//从1开始,往后踢皮球,也就是预处理
			for(l=1;l+E[i].w<=total;l++)
			{
				if(flag[l]==0)	continue;
				if(flag[l+E[i].w]==0)					flag[l+E[i].w]=flag[l]+E[i].p;
				else if(flag[l]+E[i].p<flag[l+E[i].w])	flag[l+E[i].w]=flag[l]+E[i].p;;
			}
			/*****/
		}


		if(flag[total]==0)	printf("This is impossible.\n");
		else				printf("The minimum amount of money in the piggy-bank is %d.\n",flag[total]);
	}
	return 0;
}


你可能感兴趣的:(hdu1114)