สมมติว่าเรามีอาร์เรย์ที่เรียกว่าบ้านและมีค่าอื่น k ที่นี่ บ้าน[i] หมายถึงที่ตั้งของบ้านเลขที่ริมถนน เราต้องจัดสรร k กล่องจดหมายบนถนน และหาระยะทางรวมขั้นต่ำระหว่างบ้านแต่ละหลังกับกล่องจดหมายที่ใกล้ที่สุด
ดังนั้น ถ้าอินพุตเหมือนบ้าน =[6,7,9,16,22] k =2 แล้วเอาต์พุตจะเป็น 9 เพราะถ้าเราวางเมลบ็อกซ์ที่ 7 และ 18 ระยะทางรวมขั้นต่ำจากแต่ละบ้านคือ |6 -7|+|7-7|+|9-7|+|16- 18|+|22-18| =1+0+2+2+4 =9.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
เรียงรายชื่อบ้าน
-
กำหนดฟังก์ชัน util() นี่จะใช้เวลา idx, n, k
-
ถ้า k เท่ากับ 1 แล้ว
-
core :=houses[quotient of (n + idx)/2]
-
ส่งคืนผลรวมขององค์ประกอบทั้งหมดของ [|houses[i] - core| สำหรับแต่ละ i ในช่วง idx ถึง n])
-
-
ผลลัพธ์ :=อนันต์
-
สำหรับฉันอยู่ในช่วง idx ถึง n ทำ
-
ถ้า n - i
-
ออกจากวง
-
-
ผลลัพธ์ :=ผลลัพธ์ขั้นต่ำและ util(idx, i, 1) + util(i+1, n, k - 1)
-
-
ส่งคืนผลลัพธ์
-
จากวิธีหลัก ให้ทำดังนี้:
-
ผลตอบแทนการใช้(0, ขนาดบ้าน - 1, k)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(houses, k):
houses.sort()
def util(idx, n, k):
if k == 1:
core = houses[(n + idx) // 2]
return sum([abs(houses[i] - core) for i in range(idx, n + 1)])
result = float('inf')
for i in range(idx, n + 1):
if n - i < k - 1:
break
result = min(result, util(idx, i, 1) + util(i+1, n, k - 1))
return result
return util(0, len(houses) - 1, k)
houses = [6,7,9,16,22]
k = 2
print(solve(houses, k)) อินพุต
[6,7,9,16,22], 2
ผลลัพธ์
9