在三级幂集算法背后的逻辑中挣扎

时间:2018-10-24 17:15:36

标签: python knapsack-problem powerset

我正在使用6.00.2x,这是出现的第一个问题之一。立即陷入困境很烂,但我正在努力解决它。基本上,我正在为背包问题设定动力,但不是有一个袋子,而是有两个袋子。提供了一个样品用一个袋子解决这个问题,这花了我一段时间才能弄清楚:

def powerSet(items):
    N = len(items)
    for i in range(2**N):
        combo = []
        for j in range(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo

所以我知道这是在查看正在发生哪个循环的二进制表示形式,并检查最右边的位是否为1。这就像将0的二进制表示形式中的所有1映射到(2 ^ n-1)恢复到原始设置,但相反。这就是我的看法。

现在,我知道带另一个袋子的版本可能会考虑3 ^ n种可能性。但是除此之外,我没有看到如何将示例代码转换为更新版本,因为我无法将i转换为我所知道的三进制(0、1和2)。这是我应该制作的功能的规格:

def yieldAllCombos(items):
"""
  Generates all combinations of N items into two bags, whereby each 
  item is in one or zero bags.

  Yields a tuple, (bag1, bag2), where each bag is represented as 
  a list of which item(s) are in each bag.
"""

我不是在寻找有人为我自己写解决方案(我实际上已经有了答案),我需要逻辑方面的帮助。我知道“魔术”在于从示例代码转换(i >> j) % 2 == 1:的行,但是我不确定如何。起初我以为我可以假设,如果最右边的位是0,则对应的元素将位于包1中,如果它是1,则将其包含在包2中,但这不涉及以下情况:都没放在袋子里!

我还认为最终每个手提包都将具有相同的精确功率设定,但这似乎过于简单了。考虑到某个元素可能位于袋子1 /不在袋子1中,还是袋子2 /不在袋子2中,我什至不确定如何绘制树。

很抱歉,这样的时间太长,几乎没有完成任何工作。显然,我对此有很多缠绵的问题。如果有人可以ELI5帮助我解决问题,我将不胜感激。

0 个答案:

没有答案
相关问题