我正在努力完成给定的任务近一周而没有成功找到解决方案,所以这个网站是我最后的希望。
我有0-1 Knapsack个问题,其中有20个项目具有不同的值和权重,最大重量是524.现在我需要实施蛮力来找到20个项目的最佳解决方案子集,以便总重量<= 524和所选项目的最大值。
请您指出或更好地详细说明如何运作!! 非常感谢你
答案 0 :(得分:6)
蛮力的想法很简单:
如果你想要一些伪代码,请评论。
编辑:嘿,这是伪代码以防万一。
GetCandidateSubsets(items[1..N], buffer, maxw)
1. addedSomething = false
2. for i = 1 to N do
3. if not buffer.contains(item[i]) and
weight(buffer) + weight(items[i]) <= maxw then
4. add items[i] to buffer
5. GetCandidateSubsets(items[1..N], buffer)
6. remove items[i] from buffer
7. addedSomething = true
8. if not addedSomething then
9. emit & store buffer
请注意,GetCandidateSubsets函数效率不高,即使对于强力实现也是如此。感谢amit指出这一点。您可以将其重新设计为仅将项目集的组合(而不是排列)作为首次优化进行处理。
GetMaximalCandidate(candidates[1..M])
1. if M = 0 then return Null
2. else then
3. maxel = candidates[1]
4. for i = 2 to M do
5. if weight(candidates[i]) > weight(maxel) then
6. maxel = candidates[i]
7. return maxel