不解释,如不懂参阅网上流传的《背包九讲》。
备战NOIPing :)
/*
* hdu-1114 piggy-bank
* mike-w
* 2011-10-10
* -----------------------
* 完全背包
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAXN 510
#define MAXW 10010
int T,E,F,N,W;
long p[MAXN],w[MAXN];
long opt[MAXW];
int main(void)
{
#ifndef ONLINE_JUDGE
assert(freopen("1114.in","r",stdin));
#endif
long i,j,tmp,value;
scanf("%d",&T);
while(T-->0)
{
scanf("%d%d",&E,&F);
W=F-E;
if(W<0)
puts("This is impossible.");
else if(W==0)
puts("The minimum amount of money in the piggy-bank is 0.");
else
{
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%ld%ld",p+i,w+i);
for(i=0;i<=W;i++)
opt[i]=-1;
opt[0]=0;
for(i=0;i<N;i++)
for(tmp=w[i],value=p[i];tmp<=W;tmp*=2,value*=2)
for(j=W;j>=tmp;j--)
if(opt[j-tmp]>=0)
{
if(opt[j]<0)
opt[j]=opt[j-tmp]+value;
else if(opt[j-tmp]+value<opt[j])
opt[j]=opt[j-tmp]+value;
}
if(opt[W]==-1)
puts("This is impossible.");
else
printf("The minimum amount of money in the piggy-bank is %ld.\n",
opt[W]);
}
}
return 0;
}