概念回顾
排列组合问题是算法中比较常见的问题,这种题型的难点在于组合的数据量通常比较大,朴素写法的复杂度往往达到指数级别,一般都需要优化处理。看题之前,我们先来回顾一下排列和组合的定义。
排列的英文是Permutation,简称P,组合的英文是Combination,简称C。
排列是指从n个数中按顺序选出k个,有多少种可能。
组合是指从n个数中选出k个,有多少种可能。
显然,P和C的区别在于是否有顺序。
P的公式是:
是全排列,是先排k个数后的全排列。
C的公式是:
注意分母多了一个,这正是顺序的排列数,组合不需要顺序,除去。
复习完毕,来看题。
92. 递归实现指数型枚举
题目:从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
比如n=3,也就是从1到3这3个数种选择任意的数量,选择1个、选择2个、选择3个这3种情况。
这个不要求顺序,比如选择1和2,和选择2和1是一样的。
那么答案就是
这里
显然,我们可以用位来表示数字是否选取。那么每一个位都可能选择或者不选择,比如n=3的情况,那么所求即是从000到111所有可能的值,也就是2的3次方种情况。那么我们直接输出0到的数值位1的位置不就能够达到目的了吗?
#include
#include
using namespace std;
int n;
int main(){
cin >> n;
for(int i = 0; i 1 < for(int j = 0; j 15; j++) {
if(i >> j & 1) {
printf("%d ", j + 1);
}
}
printf("\n");
}
return 0;
}
这是非递归的做法,还有一种递归的做法