这是“编程访谈元素”一书中的一个问题。 您有一个总分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];
}
我的问题是 - 这个算法没有按要求给出序列的所有排列而不是组合吗?
答案 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。即使您没有看到隐藏的循环 隐藏了一个因子表达式,其中显示的代码也是置换。