这是我前几天遇到的一个问题。 给定一个整数项目列表,我们希望将项目分割成至多N个不重叠的连续块,以最小化任何块中项目的最大数量的方式。 例如,假设我们给出了项目(5,2,3,6,1,6),我们需要3个bin。我们可以如下最佳划分这些:N非重叠最佳分区
- Ñ:1,2(2项)
- =正:3,5(2项)
- = N:6,6(2项)
每个箱具有2项,所以我们不能做任何比这更好的。 任何人都可以分享你对这个问题的想法吗?
这是我前几天遇到的一个问题。 给定一个整数项目列表,我们希望将项目分割成至多N个不重叠的连续块,以最小化任何块中项目的最大数量的方式。 例如,假设我们给出了项目(5,2,3,6,1,6),我们需要3个bin。我们可以如下最佳划分这些:N非重叠最佳分区
每个箱具有2项,所以我们不能做任何比这更好的。 任何人都可以分享你对这个问题的想法吗?
鉴于n
箱和p
项的数组,这里是一个贪婪的算法,你可以使用。
为了尽量减少项目的最大数量在斌:
p <= n
尝试使用p
箱。
只需尝试并将每个项目放在它自己的垃圾箱中。如果你有重复的数字,那么你的平均值将不可避免地更糟糕。
p > n
贪婪地使用所有的垃圾箱,但尽量保持每个人的成员数近floor(p/n)
。
floor(p/n)
与独特数字,左,右(如果存在的话)的最大重复箱。计算您拥有的垃圾箱数量并确定您需要进行的数量合并,我们将其称为r
。
重复下列r
时间:
例
{1,5,6,9,8,8,6,2,5,4,7,5,2,4,5,3,2,8,7,5}
20项4米仓{1}{2, 2, 2}{3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8}{9}
1.排序和分组{1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8, 9}
2。由最大的团体贪婪捕获{1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6}{7, 7}{8, 8, 8, 9}
3. 6箱但我们想要4,因此需要进行2次合并。
{1, 2, 2, 2, 3}{4, 4}{5, 5, 5, 5, 5}{6, 6, 7, 7}{8, 8, 8, 9}
3.第一合并{1, 2, 2, 2, 3, 4, 4}{5, 5, 5, 5, 5}{6, 6, 7, 7}{8, 8, 8, 9}
3.第二合并所以最小可实现最大为7
下面是一些psudocode会给你只是一个解决方案用最小箱量可能:
Sort the list of "Elements" with Element as a pair {Value, Quanity}.
So for example {5,2,3,6,1,6} becomes an ordered set:
Let S = {{1,1},{2,1},{3,1},{5,1},{6,2}}
Let A = the largest quanity of any particular value in the set
Let X = Items in List
Let N = Number of bins
Let MinNum = ceiling (X/N)
if A > MinNum then Let MinNum = A
Create an array BIN(1 to N+1) of pointers to linked lists of elements.
For I from 1 to N
Remove as many elements from the front of S that are less than MinNum
and Add them to Bin(I)
Next I
Let Bin(I+1)=any remaining in S
LOOP while Bin(I+1) not empty
Let MinNum = MinNum + 1
For I from 1 to N
Remove as many elements from the front of Bin(I+1) so that Bin(I) is less than MinNum
and Add them to Bin(I)
Next I
END LOOP
您的可能的最小纸盒尺寸为MinNum
和BIN(1)
至Bin(N)
将包含值的分布。
你对此有何想法?这更像是一个算法问题,你为什么只使用'java'标签,只是好奇? – YoungHobbit
欢迎来到StackOverflow。为了获得更好的响应和更少的downvotes,首先通过[快速浏览](http://stackoverflow.com/tour),然后阅读[帮助],尤其是[什么是主题](http://stackoverflow.com/帮助/话题)和[问],然后根据这些指导原则发布您的问题。 – RealSkeptic
'最大限度地减少物品的最大数量 - 你确定吗?也许'最小化平均值或(最大 - 最小)桶'? –