在两次招聘挑战中(在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。
答案 0 :(得分:0)
我认为一个小的优化将通过所有测试用例。预先计算x的最接近的较小斐波那契数。现在,在生成所有子集和之后,将m除以和。找出最接近的较小的斐波那契数(m / sum)。将其乘以总和。因此,总体时间复杂度为O(2 ^ n)。