Создайте все комбинации из N предметов в две сумки, причем каждый предмет находится в одной или ноль сумок - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно написать генератор, который возвращает каждое расположение предметов таким образом, чтобы каждый находился в одной или ни одной из двух разных сумок. Каждая комбинация должна быть представлена ​​как кортеж из двух списков, первый из которых - это элементы в 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 голосов
/ 26 октября 2019

Как подсказал @blhsing, сделать элемент первым элементом в списке исправило проблему.

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 ([item] + result[0], result[1])
            yield (result[0], [item] + result[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...