HDU 1114 Piggy-Bank (完全背包)

OJ题目 : click here ~~

题意分析:就是一个简单的完全背包问题。完全背包与01背包只有重量的循环次序不同。01背包是从大到小,完全背包相反。有的题目要求“恰好装满背包” 时的最优解, 有的则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化时有所不同。要求恰好装满背包,那么在初始化时dp[ 0 ] 为 0 ,其他设为-inf (求最大),inf(求最小)。如果并没有要求装满,而是只希望价格尽量大,初始化时应该将dp[ i ]全部设为 0 。

AC_CODE

int E , F , N , P[502] , W[502];
const int inf = 100000000;
int dp[10002];

int main()
{
        int t;
        cin >> t;
        while(t--)
        {
            scanf("%d%d%d",&E ,&F, &N);
            F -= E;
            int i , j;
            for(i = 1;i <= N;i++)
            {
                scanf("%d%d",&P[i],&W[i]);
            }
            for(i = 1;i <= F;i++)
                dp[i] = inf;//如果是求最大价值,赋值为-inf
            dp[0] = 0;//恰好装满
            for(i = 1;i <= N;i++)
                for(j = W[i];j <= F;j++)//因为是完全背包,所以重量从小到大,与01背包相反
                dp[j] = min(dp[j] , dp[j - W[i]] + P[i]);//求最小价值
            if(dp[F] == inf) printf("This is impossible.\n");
            else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F]);
        }
        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值