完全背包问题(一维)

题目

有N种物品和一个容量为V的背包,每种物品都可以无限次使用。
求解:将那些物品装入背包,可以使物品消耗的费用总和不超过背包容量,且价值总和最大。

基本思路

这种题类似于01背包问题,不同的是每种物品有无数件,所以对于每一件物品就不是取还是不取的问题,
而是取几件的问题。当然一种物品最多不会超过[V/Ci]件。我们先按照01背包问题思路理解

设f[i,v]前i种物品恰放入容量为v的背包中的最大值

状态转移方程

F[i,v]=max(f[i-1,v-k Ci]+kWi)(0<=k*Ci<=v)
虽然和01背包问题一样有O(NV)个状态求解,但是每个状态的k是不确定的,所以每个状态的时间也不再是常数,所以总的复杂度还是比较大的。

简单优化

我们不妨想一下,我们想要价值最大化,所需要的物品必然是体积越小越好,价值越大越好,不过需要注意的是,
不是单位体积得价值越大越好。
所以,如果物品一的体积小于物品二,而且物品一的价值大于物品二,我们完全可以抛弃物品二。这是肯定的,
将价值小体积大的物品换成价值大体积小的物品,永远不亏。当然这并不能改变最坏情况的时间复杂度,因为
有可能特别数据可以一件物品都不去掉。
这个优化可以简单地O(N^2)实现,倒也可以接受。当然也可以用类似数排的方法,选取相同费用中价

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值