मान लीजिए कि हमारे पास गैर-ऋणात्मक संख्याओं की एक सूची है जिन्हें अंक कहा जाता है और एक पूर्णांक लक्ष्य भी है। हमें + और - को ऐसे अंकों में व्यवस्थित करने के तरीकों की संख्या ज्ञात करनी है, ताकि व्यंजक लक्ष्य के बराबर हो।
इसलिए, यदि इनपुट संख्या =[2, 3, 3, 3, 2] लक्ष्य =9 की तरह है, तो आउटपुट 2 होगा, जैसा कि हमारे पास -2 + 3 + 3 + 3 + 2 और 2 + 3 + हो सकता है। 3 + 3 - 2.
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
-
s :=अंकों में सभी संख्याओं का योग
-
अगर (एस + लक्ष्य) मोड 2 0 या लक्ष्य> एस के समान नहीं है, तो
-
वापसी 0
-
-
W :=भागफल (s + लक्ष्य) / 2
-
dp1 :=आकार की एक सूची (W + 1) और 0 से भरें
-
dp1[0] :=1
-
dp2 :=आकार की सूची (W + 1) और 0 से भरें
-
मेरे लिए 0 से लेकर अंकों के आकार तक, करें
-
j के लिए 0 से W + 1 की सीमा में, करें
-
अगर j>=nums[i], तब
-
dp2[j] :=dp2[j] + dp1[j - nums[i]]
-
-
-
j के लिए 0 से W + 1 की सीमा में, करें
-
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