hdu 1114 Piggy-Bank(完全背包)

本文探讨了一种特殊的背包问题——硬币背包问题,即给定储钱罐的空重量和装满后的总重量,以及一系列硬币的重量和面值,求解如何选择硬币使得储钱罐达到指定总重量的同时硬币数量最少。通过动态规划的方法实现了问题的有效解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大意:

    储钱罐的空重量E,和装钱后重量F。

    给出N种硬币。 N种硬币的重量W和面值P。

就是求 容量为total = F - E的背包。装满后最小的钱数量。



#include <cstdio>                                                                                                                               
#include <algorithm>
#include <cstring> 
                   
using namespace std;
                   
int T, N, E, F, p[505], w[505], opt[10005];
                   
int main ( ) {     
    scanf ( "%d", &T );
    while ( T-- ) {
        scanf ( "%d%d%d", &E, &F, &N );
        int total = F - E;            
        for ( int i = 1; i <= N; ++i )
            scanf ( "%d%d", &p[i], &w[i] );
        for ( int i = 1; i <= total; ++i ) opt[i] = -2000000000;
                   
        opt[0] = 0;
                   
        for ( int i = 1; i <= N; ++i ) 
            for ( int j = w[i]; j <= total; ++j ) {
                if ( opt[j] < 0 ) opt[j] = opt[j - w[i]] + p[i];
                else {    
                    if ( opt[j - w[i]] + p[i] > 0 ) opt[j] = min ( opt[j], opt[j - w[i]] + p[i] );
                }  
            }      
        if ( opt[total] <= 0 )  printf("This is impossible.\n");
        else printf("The minimum amount of money in the piggy-bank is %d.\n",opt[total]);
    }              
}             



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值