HDU 1114 Piggy-Bank

来源:互联网 发布:sunday算法 python 编辑:程序博客网 时间:2024/05/16 10:12

原题链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1114

题目大意:

T组测试样例。接着给出空储蓄罐的质量和装满硬币储蓄罐的质量。接着是一个N。表示有多少种硬币。然后N行表示价值和质量。问储蓄罐中最少有多少钱

思路:

这个也是一道DP背包问题。但是这道题是求最少有多少硬币。只需改变初始化条件。和状态转移方程就可以了

代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct I{    int val;    int cost;}coin[550];int dp[10005];int main(){    int T;    scanf("%d",&T);    int em,fu,ac;    while( T-- )    {        scanf("%d %d",&em,&fu);        ac = fu - em;//硬币的总重量        int N;        int i;        scanf("%d",&N);        for( i = 0; i < N; i++ )            scanf("%d %d",&coin[i].val ,&coin[i].cost );        for( i = 0; i <= ac; i++ )            dp[i] = 10000000;//因为要求最小值。所以要求要将dp[i]赋一个不可能大的值        dp[0] = 0;        int j;        for( i = 0; i < N; i++ )        {            //for( j = ac; j >= coin[i].cost; j-- )            //这个是用来求最大值的。求最小值时必须用底下那种形式            for( j = coin[i].cost; j <= ac ; j++ )            {                dp[j] = min( dp[j],dp[j-coin[i].cost ]+coin[i].val );//状态转移方程。不过是求解最小值            }        }        if( dp[ac] == 10000000 )            printf("This is impossible.\n");        else            printf("The minimum amount of money in the piggy-bank is %d.\n",dp[ac]);    }    return 0;}
0 0
原创粉丝点击