Algorithm 将数组分区到

Algorithm 将数组分区到,algorithm,matrix,Algorithm,Matrix,给定一个正整数数组{a1,a2,…,an},需要将该数组划分为k个块/分区,这样每个分区中的整数和的最大值就是它可以达到的最小值。限制:不能改变数字出现的顺序(例如:如果有{2,5,80,1200,80,8000,90},一个分区不能是{2,80,1,90})。我需要输出分区值和分区的最大和。某种Knuth算法或其他什么?有什么建议吗?我不知道。。。 例如: {11,16,5,5,12,10}n(n=3) 根据问题进行的最佳分区是: [(11),(16,5,5),(12,10)]鉴于您无法更改数

给定一个正整数数组{a1,a2,…,an},需要将该数组划分为k个块/分区,这样每个分区中的整数和的最大值就是它可以达到的最小值。限制:不能改变数字出现的顺序(例如:如果有{2,5,80,1200,80,8000,90},一个分区不能是{2,80,1,90})。我需要输出分区值和分区的最大和。某种Knuth算法或其他什么?有什么建议吗?我不知道。。。 例如:

{11,16,5,5,12,10}n(n=3)

根据问题进行的最佳分区是:


[(11),(16,5,5),(12,10)]

鉴于您无法更改数组中数字的顺序,我建议的解决方案是:

  • 关于最大和的二元搜索
  • 给定当前最大和,使用贪婪算法查看
    k
    块是否足以覆盖整个数组
  • 算法如下所示:

    l=0
    r=sum(A)
    while l<=r:
      mid=(l+r)/2;
      if greedy(mid):
        r=mid-1
      else:
        l=mid+1
    

    很抱歉{11,16,5,5,12,10}k(k=3)你要求某种Knuth算法让我感到困惑。在Stackoverflow中寻求家庭作业帮助没有什么错。但请注意,您必须包括您迄今为止为解决该问题所做工作的摘要,以及您解决该问题的难度说明。这不是一个编程问题,而是一个数学/算法问题。我已更改了标记
    def greedy(s):
      now_k=0
      now_sum=0
      for i in A:
        now_sum+=i
        if now_sum>s:
          now_sum=0
          now_k++
      if nowsum > 0:
        now_k++
      return now_k<=k