【发布时间】:2011-10-16 23:42:18
【问题描述】:
是否有一种有效的算法将一个数字分成N 小节,以便数字的总和与原始数字相加,并具有最小值?例如,如果我想将 50 分成 7 个小节,并且最小为 2,我可以使用 10,5,8,2,3,5,17(以及任何其他数量的组合)。我想将数字保持为整数,并且相对随机,但我不确定如何有效地生成与原始数字相加并且不包括低于给定最小值的数字。有什么建议吗?
编辑 - 只是为了复制/粘贴我的评论,整数不必是唯一的,但我想避免所有整数的大小相同(例如,50 分成 10 个相同的大小)。
【问题讨论】:
-
子集总和:给定一组数字,找到总和为特定数字的子集。你的问题:给定一个数字,找到它对应的子集。我敢打赌你在 NP 完全域中:)
-
您是否希望所有整数都是唯一的?
-
@Skoder - 为什么不“随机化” :) 这将非常容易,你会得到你想要的!如果您需要“切片”为 5 块 - 只需随机选择 4 个递增数字直到上限!
-
@Nupul 我认为矩阵 [N,Set] 就足够了。在 OP 的示例中,矩阵 [7,50],在您的情况下为 [100,23]。作为一个问题约束,您将忽略数字
-
我在这个问题中看不到任何与 NP 相关的内容。您甚至可以找到一个(复杂的)组合公式
Spl(X,N,M)=..ComplexFormula..,它为您提供了多少种方法可以将一个数字X拆分为N至少具有M的小节。例如,Spl(50,7,7)将是=1。
标签: performance algorithm math numbers sum