मान लीजिए कि हमारे पास एक सरणी संख्या और एक अन्य मूल्य लक्ष्य है। हम अंकों के बाद के क्रम का चयन करना चाहते हैं ताकि इसके तत्वों का योग लक्ष्य के सबसे नजदीक हो। तो दूसरे शब्दों में, यदि बाद के तत्वों का योग s है, तो हम निरपेक्ष अंतर को कम करना चाहते हैं |s - लक्ष्य|।
इसलिए हमें |s - लक्ष्य का न्यूनतम संभव मान ज्ञात करना होगा। इसलिए, यदि इनपुट संख्या =[8,-8,16,-1] लक्ष्य =-3 की तरह है, तो आउटपुट 2 होगा क्योंकि चयन करें अनुवर्ती [8,-8,-1], -1 के योग के साथ। पूर्ण अंतर है |-1 - (-3)| =abs(2) =2, यह न्यूनतम है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=अंकों का आकार
-
x के निरपेक्ष मान प्राप्त करने के बाद -ve मान के आधार पर अंकों को क्रमबद्ध करें
-
neg :=आकार n+1 की एक सरणी बनाएं और 0 से भरें
-
pos :=आकार n+1 की एक सरणी बनाएं और 0 से भरें
-
n-1 से 0 की श्रेणी में i के लिए, 1 से घटाएं, करें
-
अगर अंक [i] <0, तो
-
neg[i] :=neg[i+1] + nums[i]
-
स्थिति[i] :=स्थिति[i+1]
-
-
अन्यथा,
-
स्थिति[i] :=स्थिति[i+1] + अंक[i]
-
नकारात्मक [i] :=नकारात्मक [i+1]
-
-
-
उत्तर :=|लक्ष्य|
-
s :=एक नया सेट उत्तर इसमें 0 डालें
-
फ़ंक्शन चेक() को परिभाषित करें। इसमें a, b
. लगेगा -
अगर b <लक्ष्य - उत्तर या लक्ष्य + उत्तर
-
झूठी वापसी
-
-
सही लौटें
-
मुख्य विधि से, निम्न कार्य करें
-
मैं के लिए 0 से n -1 की सीमा में, करो
-
sl :=x में सभी x के लिए x की एक सूची जब check(x+neg[i], x+pos[i] is true]
-
यदि sl का आकार 0 के समान है, तो
-
लूप से बाहर आएं
-
-
s :=sl से एक नया सेट
-
एसएल में प्रत्येक एक्स के लिए, करें
-
y:=x + अंक[i]
-
अगर |y - लक्ष्य| <उत्तर, फिर
-
उत्तर :=|y - लक्ष्य|
-
-
अगर उत्तर 0 के समान है, तो
-
वापसी 0
-
-
y को s में डालें
-
-
-
वापसी उत्तर
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें
from collections import Counter def solve(nums, goal): n = len(nums) nums.sort(key=lambda x: -abs(x)) neg = [0 for _ in range(n+1)] pos = [0 for _ in range(n+1)] for i in range(n-1, -1, -1): if nums[i] < 0: neg[i] = neg[i+1] + nums[i] pos[i] = pos[i+1] else: pos[i] = pos[i+1] + nums[i] neg[i] = neg[i+1] ans = abs(goal) s = set([0]) def check(a, b): if b < goal - ans or goal + ans < a: return False return True for i in range(n): sl = [x for x in s if check(x+neg[i], x+pos[i])] if len(sl) == 0: break s = set(sl) for x in sl: y = x + nums[i] if abs(y - goal) < ans: ans = abs(y - goal) if ans == 0: return 0 s.add(y) return ans nums = [8,-8,16,-1] goal = -3 print(solve(nums, goal))
इनपुट
[0,1,2,3,4], [[3,1],[1,3],[5,6]]
आउटपुट
2