计算得分组合的数量

时间:2015-06-17 03:43:32

标签: algorithm

这是“编程访谈元素”一书中的一个问题。 您有一个总分s和W,它指定了那些分数 可以在个人比赛中得分。你如何找到导致总得分为s的游戏组合的数量?你如何计算导致得分为s的单个游戏的不同序列的数量?

例如: -

  

W = {2,3,7}且s = 12,则 结果为4 - {2x6,2x3 + 3x2,   2x1 + 3x1 + 7x1,3x4}

书中给出的解决方案是 -

 int count_permutations (int k, const vector <int >& score_ways ) {
     vector <int> permutations (k + 1, 0);
     permutations [0] = 1; // one way to reach 0.
     for (int i = 0; i <= k; ++i) {
        for (const int& score : score_ways ) {
           if (i >= score) {
              permutations [i] += permutations [i - score ];
           } 
         }
     }
     return permutations [k];
}

我的问题是 - 这个算法没有按要求给出序列的所有排列而不是组合吗?

1 个答案:

答案 0 :(得分:0)

排列 有序因此会产生比组合更多的结果。这个三元组{1,2,3}的排列是(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2) ),(3,2,1)遵循一般形式n!=(n-1)×(n-2)×⋯×3×2×1。即使您没有看到隐藏的循环 隐藏了一个因子表达式,其中显示的代码也是置换