สมมติว่าเรามีรายการตัวเลขไม่ติดลบ nums และค่าเป้าหมาย target หาจำนวนวิธีวางเครื่องหมาย + หรือ - หน้าตัวเลขแต่ละตัว เพื่อให้ผลรวมเท่ากับ target
ตัวอย่าง
อินพุต: nums = [2, 3, 3, 3, 2], target = 9
เอาต์พุต: 2
วิธีที่ 1: -2 + 3 + 3 + 3 + 2 = 9
วิธีที่ 2: 2 + 3 + 3 + 3 - 2 = 9
ขั้นตอนการแก้ปัญหา
แปลงเป็นโจทย์ Subset Sum: ให้ P เป็นเซตตัวเลขที่มีเครื่องหมาย +, N เป็นเซตเครื่องหมาย -
sum(P) - sum(N) = target และ sum(P) + sum(N) = total
=> 2 * sum(P) = target + total ดังนั้น sum(P) = (target + total) / 2
ถ้า (total + target) % 2 != 0 หรือ target > total คืน 0
ใช้ DP นับจำนวน subset ที่รวมได้ W = (total + target) // 2:
dp1[0] = 1,dp2เป็นอาร์เรย์ช่วย- สำหรับแต่ละ
numในnums:- อัปเดต
dp2[j] += dp1[j - num]สำหรับj >= num - รวม
dp1[j] += dp2[j]แล้วล้างdp2
- อัปเดต
- คืนค่า
dp1[W]
การนำไปใช้ใน Python
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