回溯算法中排列组合和子集三个的问题总结


回溯算法中排列组合和子集三个的问题总结

什么是排列、组合

排列和组合本质区别在于:决策的顺序对结果有没有影响。
下面举例说明
现在有8个人,他们的名字分别为:
在这里插入图片描述
现在有 3 个奖杯,本别为 Golden 金牌,Silver 银牌,Bronze 铜牌。
我们的任务是:将这 3 个奖牌颁发给 8 个人中的 3 个,先颁发金牌,再颁发银牌,再颁发铜牌。问颁发奖牌的不同方式总共有哪些?

那么很明显,这是一个 Permutation 排列的问题,因为把金牌先颁给 Alice,再把银牌颁给 Bob,跟把金牌先颁给 Bob,再把银牌颁给 Alice 这是两种不同的颁奖方式。

公式一般都是
在这里插入图片描述


组合,那就是和顺序没有关系,比如a,b,c三个人,其中a,b组合那么[a,b]和[b,a]是相同的。公式一般为:
在这里插入图片描述

总结

  • 子集问题可以利用数学归纳思想,假设已知一个规模较小的问题的结果,思考如何推导出原问题的结果。也可以用回溯算法,要用 start 参数排除已选择的数字。

  • 组合问题利用的是回溯思想,结果可以表示成树结构,我们只要套用回溯算法模板即可,关键点在于要用一个 start 排除已经选择过的数字

  • 排列问题是回溯思想,也可以表示成树结构套用算法模板,关键点在于使用 contains 方法排除已经选择的数字,前文有详细分析,这里主要是和组合问题作对比。

  • 记住这几种树的形状,就足以应对大部分回溯算法问题了,无非就是 start 或者 contains 剪枝,也没啥别的技巧了


文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录