Làm cách nào để bạn có được tất cả các kết hợp có thể có của một bộ số trong python?

Tôi đã tìm thấy một số ví dụ về mã thực hiện một phần những gì tôi cần (xem bên dưới). Bạn có thể vui lòng giúp tôi sửa đổi một trong hai mã để làm những gì tôi cần không?

Tôi cần tìm tất cả các tổ hợp trong một danh sách các số và đối với mỗi tổ hợp để trừ (hoặc cộng, nhân hoặc chia) một giá trị VÀ sau đó để tìm kết quả nào tính tổng cho một giá trị cụ thể

Ví dụ

  1. Đây là một danh sách số. 10, 12, 3, 4, 8
  2. Và đây là giá trị tôi muốn trừ từ mỗi kết hợp. 5
  3. Và đây là giá trị mục tiêu cuối cùng (sản phẩm) cần tìm (chỉ những kết hợp cho kết quả này mới được in). 7

Vì vậy, phép tính sẽ là (Tôi chỉ đưa ra ý tưởng chung vì danh sách thực tế có thể dài hơn)

10 - 5 = 5
10 + 12 - 5 = 17
10 + 12 + 3 - 5 = 20
10 + 12 + 3 + 4 - 5 = 24
10 + 12 + 3 + 4 + 8 - 5 = 32
12 - 5 = 7
12 + 3 - 5 = 10
12 + 3 + 4 - 5 = 14
12 + 3 + 4 + 8 - 5 = 22
3 - 5 = -2
3 + 4 - 5 = 2
3 + 4 + 8 - 5 = 10
4 - 5 = -1
4 + 8 - 5 = 7

Và các kết hợp duy nhất nên "in" là

12 - 5 = 7
4 + 8 - 5 = 7

Đây là hai mã mẫu mà tôi đã tìm thấy và thực hiện một phần những gì tôi cần

def subset_sum(numbers, target, partial=[]):
    s = sum(partial)

    # check if the partial sum is equals to target
    if s == target:
        print("sum(%s)=%s" % (partial, target))
    if s >= target:
        return  # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i + 1:]
        subset_sum(remaining, target, partial + [n])


if __name__ == "__main__":
    subset_sum([10, 12, 3, 4, 8], 7)

và cái thứ hai

class Solution(object):
   def combinationSum(self, candidates, target):
      result = []
      unique={}
      candidates = list(set(candidates))
      self.solve(candidates,target,result,unique)
      return result
   def solve(self,candidates,target,result,unique,i = 0,current=[]):
      if target == 0:
         temp = [i for i in current]
         temp1 = temp
         temp.sort()
         temp = tuple(temp)
         if temp not in unique:
            unique[temp] = 1
            result.append(temp1)
         return
      if target <0:
         return
      for x in range(i,len(candidates)):
         current.append(candidates[x])
         self.solve(candidates,target-candidates[x],result,unique,i,current)
         current.pop(len(current)-1)
ob1 = Solution()
print(*ob1.combinationSum([10, 12, 3, 4, 8],7), sep='\n')

Trước, cảm ơn bạn cho bất kỳ sự giúp đỡ cung cấp. Tôi mới sử dụng Python như bạn có thể nói

Chào Luis,

Bạn nói đúng, tôi không làm bài tập về nhà cho bạn, tôi đã đưa cho bạn
các công cụ bạn cần để làm bài tập về nhà.

(Tôi dùng “bài tập về nhà” ở đây theo nghĩa bóng chứ không phải nghĩa đen. Cho dù đây là
bài tập do trường học, cơ quan giao cho bạn hay điều gì đó
bạn tự làm, điều đó không thực sự quan trọng. )

Bây giờ bạn có tất cả các công cụ bạn cần

  • chức năng kết hợp () lần lượt thực hiện từng kết hợp;

  • một vòng lặp for để kiểm tra từng tổ hợp, từng tổ hợp một;

  • hàm sum() tính tổng một danh sách các số;

  • Tôi nghĩ rằng bạn đã biết cách trừ 5;

  • Tôi nghĩ rằng bạn đã biết cách kiểm tra xem một giá trị có bằng 7 hay không;

  • và bạn biết cách in

Vì vậy, bạn sẽ có thể đặt tất cả các mảnh lại với nhau

  • Sử dụng vòng lặp for và các kết hợp để tạo từng kết hợp

  • Sử dụng tổng () và phép trừ để nhận giá trị bạn muốn

  • Sử dụng ==if để quyết định xem có nên in kết hợp không

  • Và sử dụng print() để thực sự in nó

Là người mới bắt đầu, bạn sẽ học được gấp ngàn lần bằng cách tự mình thực hiện
so với việc chúng tôi chỉ đưa cho bạn một giải pháp. Nếu bạn muốn học
nấu ăn, bạn thực sự phải vào bếp và chuẩn bị nguyên liệu
và nấu nó. Bạn sẽ không học nấu ăn bằng cách nhờ người khác làm
công việc. Lập trình cũng vậy.

Ít nhất hãy cố gắng ghép các mảnh lại với nhau. Nếu nó hoạt động, tuyệt vời.
Nếu không, hãy cho chúng tôi biết bạn đã thử những gì và chúng tôi sẽ giúp bạn hiểu
bạn đã làm gì sai và cách khắc phục.

Steven,

Bạn nói đúng, tôi không biết cách kiểm tra các giá trị trong Python. Một lần nữa, tôi hoàn toàn mới với Python

Tuy nhiên, mã bạn đã đăng ban đầu thực hiện những gì tôi cần - sau khi nhập phép trừ

from itertools import combinations
numbers = (10, 12, 3, 4, 8)
for count in range(1, 6):
    for t in combinations(numbers, count):
        print(t, sum(t)-5)

-5 ở cuối dòng in của anh ấy thực hiện thủ thuật (như bạn đã gợi ý)

Nó đưa ra các kết quả sau, trong đó hàng thứ 2 và thứ 15 (in đậm) là các giá trị tôi đang tìm kiếm và là những giá trị duy nhất tôi muốn được hiển thị

(10,) 5
(12,) 7
(3,) -2
(4,) -1
(8,) 3
(10, 12) 17
(10, 3) 8
(10, 4) 9
(10, 8) 13
(12, 3) 10
(12, 4) 11
(12, 8) 15
(3, 4) 2
(3, 8) 6
(4, 8) 7 <----------------
(10, 12, 3) 20
(10, 12, 4) 21
(10, 12, 8) 25
(10, 3, 4) 12
(10, 3, 8) 16
(10, 4, 8) 17
(12, 3, 4) 14
(12, 3, 8) 18
(12, 4, 8) 19
(3, 4, 8) 10
(10, 12, 3, 4) 24
(10, 12, 3, 8) 28
(10, 12, 4, 8) 29
(10, 3, 4, 8) 20
(12, 3, 4, 8) 22
(10, 12, 3, 4, 8) 32

TUY NHIÊN, vì tôi biết rất ít về Python, tôi không biết cách làm cho mã của bạn chỉ hiển thị hai hàng đó, hai kết hợp đó. Tôi vừa xem một số hướng dẫn nhưng họ đưa ra các ví dụ không hữu ích (sử dụng các chữ cái hoặc “xin chào thế giới” không hoạt động giống như khi sử dụng số). Tôi sẽ tiếp tục cố gắng…

Dù sao, cảm ơn bạn cho mã bạn đã cung cấp. Nó làm những gì tôi cần, mặc dù tôi rất thích nếu nó chỉ hiển thị các kết hợp mục tiêu thay vì tôi phải tìm chúng một cách trực quan