【发布时间】: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 来解决更简单的问题:找到总和为
n的p数字的集合数,其中集合的每个成员的范围为[0,n]。然后,一旦你有了这些集合,你就可以很容易地计算排列(只要记住删除重复的排列!例如,如果两个1s 无法区分,011只有3!/2!排列。) -
@MikeW 这不是家庭作业.. 正在尝试this 问题
-
@quirkystack 啊。那不是完全相同的问题。在这种情况下,你不可能让一个人赢得所有比赛。考虑一下您是否有三名玩家,并且只有两名玩家获胜。那么玩家一与玩家三发生了什么?
-
实际上我会为其余的空白获得最高分。所以,在上面的例子中,我将三个玩家的最大值设为 2 而不是 3
标签: algorithm permutation dynamic-programming subset-sum