Poj 1384 & Hdu 1114 Piggy-Bank (完全背包)

来源:互联网 发布:mac pro10.9无法升级 编辑:程序博客网 时间:2024/05/18 20:12

题目链接:http://poj.org/problem?id=1384

题意:给你一个储蓄罐空的和满的重量E、F,然后给出各种硬币的价值P和对应的重量W,要你估计出储蓄罐里面硬币价值和最小为多少,注意要保证重量和恰好为给出满的重量。1<=N<=500,1 <= E <= F <= 10000。

思路:完全背包,因为是求最小值且必须装满,故f[0]初始化为0,数组其他部分为正无穷。

注意正无穷不要习惯性写成0x7fffffff,代码中标记处执行加运算后会变负数。

#include <cstdio>#include <cstring>#define min(x,y) ((x)<(y)?(x):(y))struct Point{int p,w;void get (){scanf("%d%d",&p,&w);}}p[505];const int INF=0x0fffffff;int f[10010];int E,F,n;void CompletePack (){int i;for (i=0;i<=F-E;i++)f[i]=INF;f[0]=0;for (i=1;i<=n;i++)for (int j=p[i].w;j<=F-E;j++)f[j] = min(f[j],f[j-p[i].w]+p[i].p);    //见题解}int main (){int T;scanf("%d",&T);while (T--){scanf("%d%d%d",&E,&F,&n);for (int i=1;i<=n;i++)p[i].get();CompletePack ();if (f[F-E] == INF)printf("This is impossible.\n");elseprintf("The minimum amount of money in the piggy-bank is %d.\n",f[F-E]);}return 0;}


原创粉丝点击