Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาผลรวมที่ใกล้เคียงที่สุดใน Python


สมมติว่าเรามีจำนวนอาร์เรย์และเป้าหมายค่าอื่น เราต้องการเลือกลำดับรองของ nums เพื่อให้ผลรวมขององค์ประกอบใกล้เคียงกับเป้าหมายมากที่สุด กล่าวอีกนัยหนึ่ง หากผลรวมขององค์ประกอบในลำดับต่อมาคือ s เราก็ต้องการลดความแตกต่างแบบสัมบูรณ์ |s - goal|.

ดังนั้นเราต้องหาค่าต่ำสุดที่เป็นไปได้ของ |s - goal|.ดังนั้น ถ้าอินพุตเป็นเหมือน nums =[8,-8,16,-1] goal =-3 ผลลัพธ์จะเป็น 2 เพราะเลือก รองลงมา [8,-8,-1] รวมเป็น -1 ความแตกต่างที่แน่นอนคือ |-1 - (-3)| =abs(2) =2 นี่คือค่าต่ำสุด

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

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