题目链接:HDOJ 1114
这题提议很好理解,就是给定coins的weight和不同种类的coins,求组合成这个weight最小的价值,若不能组合,输出"This is impossible.";
题解:裸完全背包问题。不过是求装满背包而且要最小,所以还不算太裸;(max->min)
dp[0] = 0;其他初始化最大值,判断dp[weight];若为初始值则无法组合,否则就输出。
代码:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define debug 0
#define Min(a,b) ((a<b)?a:b)
#define INF 0x3fffffff
using namespace std;
const int maxn = 10000+5;
int c[505],w[505],v,n;
int dp[maxn];
int main(){
#if debug
freopen("in.txt","r",stdin);
#endif//debug
int T,a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
v = b - a;
for(int i = 0;i <= v;i++)
dp[i] = INF;
dp[0] = 0;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d%d",&w[i],&c[i]);
for(int i = 1;i <= n;i++)
for(int j = c[i];j <= v;j++)
dp[j] = min(dp[j],dp[j-c[i]] + w[i]);//完全背包
if(dp[v] == INF)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);
}
return 0;
}