Я беру 6.00.2х, и это одна из первых проблем, которая возникла.Мгновенно тупой отстой, но я пытаюсь справиться с этим.По сути, я делаю набор мощности для решения проблемы с рюкзаком, но вместо одной сумки есть две.Был предоставлен образец для решения этой проблемы с одной сумкой, и мне потребовалось некоторое время, чтобы выяснить:
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. Это работает так же, как отображение всех 1 в двоичных представлениях от 0 до (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.
"""
Я не ищу кого-то, кто бы просто написал решение для меня (у меня уже есть ответ), мне нужна помощьс логикой.Я знаю, что "магия" заключается в преобразовании строки if (i >> j) % 2 == 1:
из примера кода, но я не уверен, как это сделать.Сначала я подумал, что могу предположить, что если бы самый правый бит был 0, соответствующий элемент был бы в сумке 1, а если бы это был 1, он был бы в сумке 2, но это не покрывает случаи, когдани в одной сумке!
Я также подумал, что в конечном итоге каждая сумка будет иметь одинаковый точный набор мощности, но это кажется чрезмерным упрощением.Я даже не уверен, как нарисовать дерево для возможностей, учитывая, что элемент может быть либо в сумке 1 / не в сумке 1, либо в сумке 2 / не в сумке 2.
Извините, что это былотак долго с небольшой работой.У меня явно много затяжных вопросов по этому поводу.Если бы кто-нибудь мог ELI5 помочь мне пройти через это, я был бы очень признателен.