题目大意:给你一个存钱罐,n种类型的硬币,问用这些硬币将存钱罐装满所能得到的最小价值是多少。
简单的完全背包。代码如下
#include <iostream>
#include<cstdio>
#include<cstring>
#define M(a,b) memset(a,b,sizeof(a))
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std;
int w[505],c[505],dp[10005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
M(dp,127);//注意这里并不是把dp的初值赋为127,而是2139062143,具体请参考memset的具体用法
int INF=dp[0];
int a,b,n,i,j;
scanf("%d%d",&a,&b);
a=b-a;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d%d",&w[i],&c[i]);
dp[0]=0;
for(i=1;i<=n;i++)
{
for(j=c[i];j<=a;j++)
{
dp[j]=Min(dp[j],dp[j-c[i]]+w[i]);
}
}
if(dp[a]!=INF) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[a]);
else printf("This is impossible.\n");
}
return 0;
}