这是我几天前遇到的一个问题。 给定一个整数项列表,我们希望将项目分区为最多N个非重叠连续的分箱,以最小化任何分箱中的最大项目数。 例如,假设我们得到了项目(5,2,3,6,1,6),我们想要3个箱子。我们可以按如下方式对这些进行最佳分区:
每个垃圾箱都有2个项目,所以我们不能做得更好。 有人可以分享你对这个问题的看法吗?
答案 0 :(得分:0)
给定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.
答案 1 :(得分:0)
以下是一些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)
将包含值的分配。