完全背包 代码看起来和01背包很像
只是方向反了 并且一旦满足状态方程要求 就减去重量后往里加币值 最终得出最小值
若末值仍为999999999 说明无任何可以凑成这个重量的方法
#include<stdio.h>
int a[10001],e,f,n,p[500],w[500],t,i,j;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&e,&f,&n);
for(i=0;i<n;++i)scanf("%d%d",p+i,w+i);
for(f-=e,a[0]=0,j=1;j<=f;++j)a[j]=999999999;//a[0]=0确保每样物品的首个可以放入
for(i=0;i<n;++i)
for(j=w[i];j<=f;++j)
if(a[j-w[i]]+p[i]<a[j])
a[j]=a[j-w[i]]+p[i];
if(a[f]==999999999)puts("This is impossible.");
else printf("The minimum amount of money in the piggy-bank is %d.\n",a[f]);
}
}