所以,更正式地说,我得到了N个数字,需要把它们分成K个组,这些组中没有一个是空的。每组范围的总和需要最小。例如:
N = 4,K = 2,输入为{5,3,1,1}。
一种可能的解决方案是 {5,3},{1,1}。范围的总和为 2 ((5-3) (1-1))。
另一种方法是{1,1,3}{5},它也是2((3-1)(单个数字的范围是0)。
范围始终是组中最大数字和最小数字之间的差值。
当我搜索互联网时,很明显我需要使用动态编程,但我得到的只是K=2的解决方案。
有人能帮忙吗?
因此,在这个问题上,我们希望最小化组的范围。
所以假设我们有数组A={1,3,5,7,5,2}
每个数组中的最大范围是max[a]-min[a]
,最小范围0
我们可以使用二分搜索法的一个变型来寻找最小范围,这个答案是有限制的,即组必须包含连续的数字。
对于二进制搜索,我们需要选择由数组的最小和最大范围给出的边界。
这个psuedo/java代码看起来像这样。
main(){
int upper = max(A)-min(A);
int lower = 0;
while (true) {
int mid = upper-lower;
int blocks = calculateBlockCount(A, mid);
if (blocks < K) {
upper = mid - 1;
}
else if (blocks > K) {
lower = mid + 1;
}
else {
return upper;
break;
}
}
}
private static int calculateBlockCount(int[] array, int range) {
int count = 0;
int[] dumie_array;
int dumie_array[].add[array[0]];
for (int i = 0; i < array.length; i++) {
int dumie_array[].add[array[i]]
if (Func_range(dumie_array) > range) {
count++;
dumie_array = array[i];
}
else {
dumie_array.add(array[i]);
}
}
return count;
}
private static int Func_range(int[] input) {
int range = 0;
range= max(input)-min(input)
return sum;
}
希望stil能帮上忙
我认为这大部分在java中是可行的,只有C语言中的add功能是不存在的。(不想通过创建数组列表来写这么多。)但是我觉得节目的思路应该是清晰的。< br >这都是基于这个帖子需要算法搜索最小大和的解释。这是一个非常相似的问题。
干杯,吉斯
通过动态编程,你想出了k = 2的解决方案。现在想想怎么把它推广到k = 3。
假设f2(n)返回k=2和前n个数字的最优解,f3(n)=f2(n-m)err(n-m, n)。这是扩展它的一种方法。
我一直陷在这个问题中,找不到有效的解决办法。 我有N(高达1000万)说最大100个元素的数组。这些数组包含1-10000的数字。 现在我的问题是将这些数组划分为K个组,这样我就可以最小化所有数组中的重复项,即一个数组包含1,4,10,100,另一个数组包含1100。我希望他们进入同一组,因为这样可以最大限度地减少口是心非。我的问题的两个限制条件如下- > 组中向量的数量应均匀分布。 根据大小以递
如何将整数数组划分为N个子集,使这些子集的和最小? 例如,数组由11个元素组成,我需要其中的6个子集。 子集:<code>{2,1,1,3},{4},}4,3},}3,2},1,2},{3}</code>最小和=7。 另一个答案是:最小和=7。 注意:在分区时,必须保持数字在原始集合中出现的顺序。
该问题给出了两个输入:数组(arr)和由数组构成子数组的次数(n)。子数组的和应该是奇数 已经很清楚,如果所有的数字都是偶数。奇数和子数组是不可能的。对于奇数和,连续的2个数字应该是奇数+偶数或者偶数+奇数。但我似乎不能把它们分成N个子数组。请帮忙解释一下逻辑。
问题内容: 我有两个值: [3:6] 我试图在Golang中玩一些游戏,但是我找不到能够根据这些值创建数组的好方法。 我要实现的目标是: 问题答案: 您可以利用该构造使其更紧凑甚至更快: 出于好奇,可以在不使用循环变量的情况下实现循环,但是这样会更慢,并且代码也更长。通过递减: 或递增:
相关主题: 卡达内算法
给定一个< code>n数和sum 的列表,将这些数分成< code >两个组,使得每组中的数之和小于或等于s。如果可以分组,则打印< code>YES,如果不能分组,则打印< code>NO。 例如,如果< code>n=3,s=4和< code>n数是< code>2,4,2。在这种情况下,输出为< code>YES,因为可以形成两个组< code>(2,2)和(4)。 我的解决方案如下。 是