Как подсчитать все возможные подмножества списка больше, чем равно c

#python #python-3.x #algorithm #dynamic-programming

#python #python-3.x #алгоритм #динамическое программирование

Вопрос:

Как я могу найти все подмножества списка. предположим, у меня есть a list [1,2,3,4] и c = 5 ,

таким образом, подмножество будет {3,2} , и {4,1}

я не хочу рассматривать элемент дважды, поэтому {1,2,3} не буду рассматривать

Заранее спасибо .

Ответ №1:

Мы можем использовать dfs approve для вычисления всех подмножеств. В функции dfs, когда индекс равен len(nums), мы можем предположить, что подмножество найдено.

Теперь мы сначала вычисляем сумму подмножества и проверяем, равно ли это целевому значению, если нет, мы не будем добавлять его в наш выходной результат.

Если это равно, то мы проверим, все ли элементы curr не посещены. Если все они не посещены, мы добавим их в выходной список.

 class Solution:
    
    def dfs(self, nums, index, curr, res):
        if index == len(nums):
            if sum(curr) != self.target:
                return
            flag = 0
            for item in curr:
                if self.visited[nums.index(item)]:
                    flag = 1
                    break
            if flag == 0:
                for item in curr:
                    self.visited[nums.index(item)] = True
                res.append(curr[:])
            return
        curr.append(nums[index])
        self.dfs(nums, index   1, curr, res)
        curr.pop()
        self.dfs(nums, index   1, curr, res)
        return
    
    def subsets(self, nums: List[int], target) -> List[List[int]]:
        res = []
        curr = []
        self.target = target
        self.visited = [False] * len(nums)
        self.dfs(nums, 0, curr, res)
        return res
 

Ответ №2:

Вы можете попробовать itertools.combinations с list пониманием:

 >>> from itertools import combinations
>>> lst = [1,2,3,4]
>>> [i for n in range(len(lst)   1) for i in combinations(lst, n) if sum(set(i)) == 5]
[(1, 4), (2, 3)]
>>> 
 

Комментарии:

1. Необязательно иметь фиксированную длину подмножества.

2. @Akashnitter отредактировал мой ответ, теперь у него нет фиксированной длины подмножества, пожалуйста, проголосуйте и примите, если это работает

3. @U11-Вперед, я думаю, вы пропустили эту строку в вопросе «я не хочу рассматривать элемент дважды, поэтому {1,2,3} не будет рассматриваться»

4. Спасибо, но ваш код рассматривает элементы дважды в случае sum(i)> = 5

5. @Akashnitter Нет, сейчас это не так, я изменил его, я использовал set , пожалуйста, посмотрите последнее редактирование