动态编程以生成组合

时间:2015-03-03 18:06:00

标签: java algorithm recursion dynamic-programming

我接受了技术电话采访,直到我被问到这个问题我做得很好。我完全迷失了,我对如何解决这个问题一无所知。

您将获得以下输入:总得分,玩家数量,每位玩家的得分。样本输入将是

10 4 3 5 5 7

其中

  

10 =总分

     

4 = 4名球员

     

3 =玩家1得分

     

5 =玩家2得分

     

5 =玩家3得分

     

7 =玩家4分数

您要打印出与总分相等的任何组合。例如,我们知道玩家4和玩家1可以具有总得分10的组合得分。因此上述答案的输出将是

1 4

1 =玩家1的索引4 =玩家4的索引。是的我知道玩家1的索引在技术上是0但他们说打印出来就是这样。如果没有匹配的组合,您可以打印出任何您喜欢的内容。那没关系。

MY ATTEMPT

我首先告诉采访者我可以用蛮力的方法解决这个问题,而不是保持沉默。他当然说,但我们需要更好的运行时间。

所以我开始认为我们可以找到所有可能导致总美元的组合并使用MEMOIZATION存储以前存储的值。我无法想到产生所有组合的方法,因此我被困在那里。

更新 他还提到我能给你的最高分是1000分。我甚至不确定为什么这很重要?

如果有人可以在正确的方向上引导我,甚至提供如何解决此类问题的伪/工作java样本,我将不胜感激。我认为这是一个普遍的问题,我真的想了解如何解决这个问题

1 个答案:

答案 0 :(得分:1)

这是subset sum problem,并且假设你的分数是相对较小的整数,可以使用DP在伪多项式时间内求解:

D(i,0) = 1
D(0,x) = 0     x > 0
D(i,x) = D(i-1, x) + D(i-1, x-arr[i])

上述递归公式将生成大小为total_score X num_players的矩阵。可能组合的数量在矩阵的右下方条目中表示。

这个想法是模仿一个详尽的搜索,对于每个人你可以添加或不添加它,并调用递归到一个较小的问题。

DP解决方案的伪代码:

Input:
let W be the total score
let arr be the array of players scores
let n be the size of arr
Pseudo Code:
declare 2d array D of size W+1 X n+1
//initialization of "borders":
for each i from 0 to n+1:
    D[i][0] = 1
for each x from 1 to W+1
    D[0][x] = 0
//the DP:
for each i from 1 to n+1:
   for each x from 1 to W+1:
       if arr[i] < x:
          D[i][x] = D[i-1][x]
       else:
          D[i][x] = D[i-1][x] + D[i-1][x-arr[i]]
//by here you have the matrix D filled up
//the wanted value is D[n][W]
return D[n][W]
相关问题