Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 대상을 얻기 위해 기호를 배열할 수 있는 여러 가지 방법을 찾는 프로그램?

<시간/>

nums라는 음수가 아닌 숫자 목록이 있고 정수 대상도 있다고 가정합니다. 표현식이 target과 같도록 +와 -를 숫자로 배열하는 방법의 수를 찾아야 합니다.

따라서 입력이 nums =[2, 3, 3, 3, 2] target =9와 같으면 -2 + 3 + 3 + 3 + 2 및 2 + 3 +를 가질 수 있으므로 출력은 2가 됩니다. 3 + 3 – 2.

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • s :=모든 숫자의 합

  • (s + target) mod 2가 0 또는 target> s와 같지 않으면

    • 0 반환

  • W :=(s + target)의 몫 / 2

  • dp1 :=크기 목록(W + 1) 및 0으로 채우기

  • dp1[0] :=1

  • dp2 :=크기 목록(W + 1) 및 0으로 채우기

  • 범위 0에서 숫자 크기까지의 i에 대해

    • 0 ~ W + 1 범위의 j에 대해 수행

      • j>=nums[i]이면

        • dp2[j] :=dp2[j] + dp1[j - 숫자[i]]

    • 0 ~ W + 1 범위의 j에 대해 수행

      • dp1[j] :=dp1[j] + dp2[j]

      • dp2[j] :=0

  • dp1의 마지막 요소를 반환

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

class Solution:
   def solve(self, nums, target):
      s = sum(nums)
      if (s + target) % 2 != 0 or target > s:
         return 0
      W = (s + target) // 2
      dp1 = [0] * (W + 1)
      dp1[0] = 1
      dp2 = [0] * (W + 1)
      for i in range(len(nums)):
         for j in range(W + 1):
            if j >= nums[i]:
               dp2[j] += dp1[j - nums[i]]
            for j in range(W + 1):
               dp1[j] += dp2[j]
               dp2[j] = 0
         return dp1[-1]

ob = Solution()
nums = [2, 3, 3, 3, 2]
target = 9
print(ob.solve(nums, target))

입력

[2, 3, 3, 3, 2], 9

출력

2