01背包”及“完全背包”装满背包的方案总数分析及实现

本文介绍了01背包和完全背包问题的解决方案,探讨了如何计算将背包刚好装满的方案总数。通过状态转移方程,给出了一维和二维数组的伪代码实现,降低了空间复杂度。同时,对于两种背包问题的区别进行了阐述。
摘要由CSDN通过智能技术生成
  本文为网上复制
 
 
本人博文 《背包问题——“01背包”最优方案总数分析及实现》《背包问题——“完全背包”最优方案总数分析及实现》中分别谈过“01背包”和“完全背包”实现最大价值的方案总数,这里我们再讨论一下这两种背包被物品刚好装满的方案总数。

        网上各大公司经常出题目:假设现在有1元、2元、5元的纸币很多张,现在需要20块钱,你能给多少种找钱方案,这就可以认为是完全背包问题,即背包容量为20,物品体积分别为1、2、5。

        还有公司出题目:给定一个数m,将m拆成不同的自然数的和的形式有多少种方案,这就是典型的01背包问题,背包容量为m,物品件数为k,这里面的k是隐含条件,可以求出来,因为m最多由1+2+…+k得到,由此可以根据m求得物品件数的上限。

 

       现在切入正题,我们先谈“01背包”将背包刚好装满的方案总数。“完全背包”和“01背包”极为相似,只有极少量代码变动

 

       01背包装满的问题抽象化:

       设背包容量为V,一共N件物品,每件物品体积为C[i],每件物品的价值为W[i],求将背包装满的方案总数。

       1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中刚好把背包装满的方案总数。

       2) 根据第i件物品体积和所剩背包容量大小进行决策

                                              (1-1)

       注意初始化条件为F[0][0]=1,即没有物品放入容量为0的背包刚好放满的方案数为1。

       故可得伪代码如下:

[cpp]
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值