将N个物品的所有组合生成到两个袋子中,其中每个项目都放在一个或零个袋子中

时间:2019-10-26 02:46:55

标签: python algorithm generator

我需要编写一个生成器,该生成器返回物品的每种排列方式,以使每种物品都装在两个不同的袋子中,或者不在两个袋子中。每个组合都应以两个列表的元组形式给出,第一个是bag1中的项目,第二个是bag2中的项目。

我编写了以下代码,但该代码未能通过一个测试用例。它说我的实现比正确答案有更多安排。第二个测试用例通过。我看不到测试用例正在使用哪些项目,但是我尝试了一些值,它似乎可以工作。有人可以给我解释一下怎么了吗?

我基本上正在做的是删除数组中的第一项,并与其余部分递归地调用该函数。然后,我为递归返回的每个安排生成了所有可能的安排,并删除了先前删除的项目(不添加,仅将其添加到第一个袋子,仅将其添加到第二个袋子)。

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.
    """
    # Your code here
    if (items == []):
        yield ([], [])
    else:
        item = items[0]
        for result in yieldAllCombos(items[1:]):
            yield (result[0], result[1])
            yield (result[0] + [item], result[1])
            yield (result[0], result[1] + [item])

1 个答案:

答案 0 :(得分:0)

如@blhsing所建议的那样,使该项目成为列表中的第一个元素即可解决问题。

import matplotlib.pyplot as plt
import numpy as np

center = [5, 3]
L = np.array([-10, 10])

fig, ax = plt.subplots()
ax.set_aspect(1)
for a in range(0, 180, 20):
    phi = np.deg2rad(a)
    x = center[0] + np.cos(phi) * L
    y = center[1] + np.sin(phi) * L
    ax.plot(x, y)