【问题标题】:Finding number of permutations of 'p' numbers that sum to a given number 'n'查找总和为给定数字“n”的“p”数字的排列数
【发布时间】:2013-06-28 23:29:59
【问题描述】:

我正在尝试解决一个动态规划问题,其中一部分问题涉及查找 一组“p”数的排列数,总和为一个数“n”。 p 组中的每个数字都应介于 0 到 n 之间。

例如如果 n = 4 和 p = 3,我有以下 12 个排列

{4,0,0},{0,4,0},{0,0,4}
{2,2,0},{2,0,2},{0,2,2}
{1,3,0},{1,0,3},{0,1,3}
{1,1,2},{1,2,1},{2,1,1}

我从这种 DP 方法开始。

n(i,j) represents number of ways of representing n using i,j in p positions 

我的基本情况是

n(i,0) = n(0,i) = p   

(例如,p=3 处的 n(4,0) 为 3,即 {4,0,0},{0,4,0},0,0,4}

递归案例

n(i,j) = n(i,j-1)*n(i-1,j)

(示例:n(1,2) = n(1,1) * n(0,2) 递归为 n(1,0) * n(0,1) * 2)

我不确定我是否朝着正确的方向前进,因为上述方法并没有让我得到正确的答案。请指引我正确的方向。

【问题讨论】:

  • 这可能是作业问题吗?
  • 排列部分似乎几乎完全分开——加法是可交换的和结合的。看起来您可以使用 DP 来解决更简单的问题:找到总和为 np 数字的集合数,其中集合的每个成员的范围为 [0,n]。然后,一旦你有了这些集合,你就可以很容易地计算排列(只要记住删除重复的排列!例如,如果两个 1s 无法区分,011 只有 3!/2! 排列。)
  • @MikeW 这不是家庭作业.. 正在尝试this 问题
  • @quirkystack 啊。那不是完全相同的问题。在这种情况下,你不可能让一个人赢得所有比赛。考虑一下您是否有三名玩家,并且只有两名玩家获胜。那么玩家一与玩家三发生了什么?
  • 实际上我会为其余的空白获得最高分。所以,在上面的例子中,我将三个玩家的最大值设为 2 而不是 3

标签: algorithm permutation dynamic-programming subset-sum


【解决方案1】:

与我的评论相反,如果我们同时计算集合的数量和这些集合的排列,这个问题实际上更容易解决。

如果我们只需要计数而不是实际生成每个集合,我们可以直接使用一些简单的组合来做到这一点。让我们为示例修复 p = 3, n = 5 并假设我们有 n = 5 球:

o o o o o

现在的问题相当于,我们有多少种方法可以将球分成3 的组,每组可以有[0, 5] 球?想象一下,如果我们有 p - 1 = 2 可以单独放置在任何地方的棍子:在所有五个球之前,在所有五个球之后,以及在任何两个球之间。例如:

| o o | o o o => (0, 2, 3)
o | | o o o o => (1, 0, 4)
o o o o | | o => (4, 0, 1)

注意这些问题是如何等效的?无论如何,我们可以放置这些棍子,我们也可以将我们的n 球分成p 组。注意,我们只需要p - 1 棒来生成p 数字(第一棒之前的所有球都是第一组,最后一棒之后的所有球都是最后一组,两根棒之间的任何球都是其他组)。

所以现在我们的问题是我可以用多少种方式排列我的n 球和p - 1 棒?您可以将其视为拥有n + (p - 1) 插槽,而您只是在为球选择n 位置......其余的都是棒子所在的位置。以这种方式思考它,我们可以应用组合学的基本公式(它已使用和的公理化规则和乘积规则证明......我什至不确定我是否见过证明):

(n + (p - 1)) Choose n = (n + (p - 1))! / n! / (p - 1)!

所以在我们的示例中,它是7! / 5! / 2! = 21。你可以看到在你的例子中它是6! / 4! / 2! = 15。您错过了一些排列(例如,{0, 3, 1})。

您也可以使用 DP 通过简单的递归方程来解决这个问题。基本上

`f(n, p) = Sum over i = 0 to n, f(n - i, p - 1)`

并记住f 的一些值。这个想法是,您选择集合S 的第一个成员的值,然后下一个递归调用选择S 的下一个成员,依此类推。基本情况可能类似于f(0, p) = 1f(n, 0) = 0,否则您可以使用递归情况。如果您实际上并不需要这些集合本身,那么封闭形式的性能显然要好得多。

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 2017-06-06
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多