扭曲背包问题(不受斐波那契约束)

时间:2019-01-04 13:07:16

标签: algorithm data-structures dynamic-programming fibonacci knapsack-problem

在两次招聘挑战中(在HackerEarth上),我遇到了以下问题。该问题无法在线获得,因此,请尽我所能来解决问题:

给出一个具有M权重和n项的背包,每个项都具有正权重w和正值v(以数组weight[]和{ {1}})。每个项目都可以无限次数地提取。但是,如果您多次提取val[]项,那么所有其他项目(如果已提取)也必须被提取x数时代。
这里x是小于100的斐波那契数。
找到背包的总重量为x时可以拥有的最大值。

约束:
n <= 20
(M,重量,有效值)<= 1e9


示例测试用例:

n = 2,M = 125
体重= [50,25]
val = [100,51]

对于x = 1:最大val是100 + 51 = 151

对于x = 2:最大val为2 * 100 = 200

对于x = 3:最大val是3 * 51 = 153

对于x = 5:最大val是5 * 51 = 255

对于其余x:最大值将为0

有人可以建议如何使用它吗?
这是我所做的:

生成所有可能的项目子集(使用位掩码),对于每个子集,我一直将其权重乘以<= M直到权重超过x = 1,2,3,5...为止,同时保持到目前为止获得的最大val计数在M迭代之后,即使我有我的答案,但它仅通过了15个测试用例中的3个,其余都获得了TLEd。

1 个答案:

答案 0 :(得分:0)

我认为一个小的优化将通过所有测试用例。预先计算x的最接近的较小斐波那契数。现在,在生成所有子集和之后,将m除以和。找出最接近的较小的斐波那契数(m / sum)。将其乘以总和。因此,总体时间复杂度为O(2 ^ n)。