📜  巧克力分配问题的Python程序

📅  最后修改于: 2022-05-13 01:56:04.725000             🧑  作者: Mango

巧克力分配问题的Python程序

给定一个包含 n 个整数的数组,其中每个值代表一包中巧克力的数量。每个包可以有不定数量的巧克力。有 m 个学生,任务是分发巧克力包,这样:

  1. 每个学生得到一包。
  2. 给学生的巧克力包中的巧克力数量与巧克力数量之差最小。

例子:

来源: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),因为我们在子数组搜索之前应用排序。

请参阅有关巧克力分配问题的完整文章以获取更多详细信息!