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