背包九讲学习笔记:第四讲-混合三种背包问题 第五讲-二维费用的背包问题

第四讲-混合三种背包问题

问题

如果三种背包问题混合起来,即有的物品能选一次,有的物品能选多次,有的物品能选无限次,如何求解?

解法

那当然是分类讨论if else.
其实在完全背包的解法中就有这样的感觉.对于总体积超过背包体积的,按完全背包算.

实现
01背包实际上都按多重背包解即可,复杂度不会提高.而对于完全物品,设置它的数量为v/volume[i]*10,保证不会爆范围就行,这样走多重背包的时候就会直接走第一个if.

其他

原文中特别注重培养抽象出模型的能力,实际上这个能力也非常重要.在写多重背包时,调用01背包和完全背包就使用了这样的能力.

第五讲-二维费用的背包问题

问题

给一个容量为V的背包,你的负重最大只有W,然后有n种物品,每种都有若干个(0个,无限,多个),体积为volume[i],重量为weight[i],价值为value[i].问最多能装多少价值的物品,在不超过体积及负重的情况下?

解法

状态加一维
用dp[j][k]表示容量为j负重为k时的最大价值.
则dp[j][k]=dp[j-volume[i]][k-weight[i]]+value[i].
根据物品种类的不同,选择01背包,完全背包,多重背包的转移方式.

其他

常见的问题是个数限制,这个时候将个数变成第二维是个不错的选择.
除此之外,原文中说二维背包实际上类似于复整数域的一维背包,我的理解是两个维度是完全正交的,完全不相关地添加.而且用这样地方法可以实现更高维地背包.

例题 vijos 1334 NASA的食物计划

二维费用01背包,模板题
注意01背包和完全背包的遍历顺序不同,不要写错了

    int v=read(),w=read(),n=read();
    for(int i=1;i<=n;i++)
        volume[i]=read(),weight[i]=read(),value[i]=read();
    for(int i=1;i<=n;i++)
        for(int j=v;j>=volume[i];j--)
            for(int k=w;k>=weight[i];k--)
                dp[j][k]=max(dp[j][k],dp[j-volume[i]][k-weight[i]]+value[i]);
    printf("%d\n",dp[v][w] );
    return 0;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值