#include <stdio.h> #include <memory> int a[5]; void f(int i,int n,int k){ //构造1--n的一个子集,对于1--n,每一个数字只有2种状态,放或者不放 //当前已经处理了前i - 1个元素,现在处理第i个元素 //这一个子集目前有k - 1个元素,新加入的元素放在第k个位置 if(i > n){ printf("{ "); for(int j = 1;j <= k - 1;j++) printf("%d ",a[j]); printf("}/n"); } else{ //放 a[k] = i; f(i + 1,n,k + 1); //回溯前的清理.在上一个状态a[k] = 0... a[k] = 0; //不放 f(i + 1,n,k); //回溯前的清理.在上一个状态a[k] = 0... a[k] = 0; } } bool visit[5]; void per(int i,int n){ //构造1--n的一个排列 //已经处理了这个排列的前i - 1位,现在处理第i位 //第i位要插入的数字为k if(i > n){ for(int j = 1;j <=n;j++) printf("%d",a[j]); printf("/n"); } else{ for(int j = 1;j <= n;j++) if(!visit[j]){ visit[j] = true; a[i] = j; per(i + 1,n); //回溯 visit[j] = false; a[i] = 0; } } } int main(){ memset(a,0,sizeof(a)); f(1,3,1); memset(a,0,sizeof(a)); memset(visit,false,sizeof(visit)); per(1,3); return 0; }