我正在使用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帮助我解决问题,我将不胜感激。