Algorithm 将数组分区到
给定一个正整数数组{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) 根据问题进行的最佳分区是: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)]鉴于您无法更改数
[(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