题目
有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)实现,倒也可以接受。当然也可以用类似数排的方法,选取相同费用中价