/*
超时的嘛。可是最终的结果还就是由前面的点的值构建起来的,怎么办呢?
用预处理的思想(我说的不是方法,是思想),来减少针对每个点的计算量!
具体的看代码吧,这东西要悟的……
2012-05-08
*/
分析
预处理+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;
}