巧克力分配问题的Python程序
给定一个包含 n 个整数的数组,其中每个值代表一包中巧克力的数量。每个包可以有不定数量的巧克力。有 m 个学生,任务是分发巧克力包,这样:
- 每个学生得到一包。
- 给学生的巧克力包中的巧克力数量与巧克力数量之差最小。
例子:
Input : arr[] = {7, 3, 2, 4, 9, 12, 56} , m = 3
Output: Minimum Difference is 2 Explanation:
We have seven packets of chocolates and
we need to pick three packets for 3 students
If we pick 2, 3 and 4, we get the minimum
difference between maximum and minimum packet
sizes.
Input : arr[] = {3, 4, 1, 9, 56, 7, 9, 12} , m = 5
Output: Minimum Difference is 6
Explanation:
The set goes like 3,4,7,9,9 and the output
is 9-3 = 6
Input : arr[] = {12, 4, 7, 9, 2, 23, 25, 41,
30, 40, 28, 42, 30, 44, 48,
43, 50} , m = 7
Output: Minimum Difference is 10
Explanation:
We need to pick 7 packets. We pick 40, 41,
42, 44, 48, 43 and 50 to minimize difference
between maximum and minimum.
来源:Flipkart 面试经历
一个简单的解决方案是生成 arr[0..n-1] 的所有大小为 m 的子集。对于每个子集,找出其中最大和最小元素之间的差异。最后,返回最小差值。
一个有效的解决方案是基于这样的观察,即为了最小化差异,我们必须从排序的数据包中选择连续的元素。我们首先对数组 arr[0..n-1] 进行排序,然后找到大小为 m 的子数组,其中最后一个元素和第一个元素之间的差异最小。
下图是上述方法的试运行:
下面是上述方法的实现:
Python3
# Python3 program to solve chocolate
# distribution problem
# arr[0..n-1] represents sizes of packets
# m is number of students.
# Returns minimum difference between maximum
# and minimum values of distribution.
def findMinDiff(arr, n, m):
# if there are no chocolates or number
# of students is 0
if (m==0 or n==0):
return 0
# Sort the given packets
arr.sort()
# Number of students cannot be more
# than number of packets
if (n < m):
return -1
# Largest number of chocolates
min_diff = arr[n-1] - arr[0]
# Find the subarray of size m such that
# difference between last (maximum in case
# of sorted) and first (minimum in case of
# sorted) elements of subarray is minimum.
for i in range(len(arr) - m + 1):
min_diff = min(min_diff ,
arr[i + m - 1] - arr[i])
return min_diff
# Driver Code
if __name__ == "__main__":
arr = [12, 4, 7, 9, 2, 23, 25, 41,
30, 40, 28, 42, 30, 44, 48,
43, 50]
# Number of students
m = 7
n = len(arr)
print("Minimum difference is",
findMinDiff(arr, n, m))
# This code is contributed by Smitha
输出:
Minimum difference is 10
时间复杂度: O(n Log n),因为我们在子数组搜索之前应用排序。
请参阅有关巧克力分配问题的完整文章以获取更多详细信息!