数据结构与算法第六十三节排列与组合

P:全排列问题

程序代码:

#includeiostream#includeiomanipusingnamespacestd;inta[15];boolb[15];intn;voidprint(){for(inti=1;i=n;i++){coutsetw(5)a[i];}coutendl;}voiddfs(intx){if(xn){print();return;}for(inti=1;i=n;i++){if(b[i]==0){//不能有重复枚举a[x]=i;b[i]=true;dfs(x+1);//回溯,如果不选,可以画递归树帮助理解a[x]=0;b[i]=0;}}}intmain(){cinn;dfs(1);return0;}

P:组合输出

程序代码:

#includeiostream#includeiomanipusingnamespacestd;inta[25];intb[25];intn,r;voidprint(){for(inti=1;i=n;i++){coutsetw(3)a[i];}coutendl;}voiddfs(intx){if(xr){print();return;}for(inti=1;i=n;i++){if(b[i]==0ia[x-1]){//只允许从小到大进行组合a[x]=i;b[i]=true;dfs(x+1);//回溯,不选的状态a[x]=0;b[i]=0;}}}intmain(){cinnr;dfs(1);return0;}

P:选数

程序代码:

#includeiostreamusingnamespacestd;inta[25];intn,k;intsum=0;boolis_prime(intx){if(x2){returnfalse;}for(inti=2;i=x/i;i++){if(x%i==0){returnfalse;}}returntrue;}voiddfs(ints,intt,intcount){if(s==n

count==k){//这里s从0开始,到n就结束了?if(is_prime(t)count==k){sum++;}return;//结束条件不要忘了写}//选,计数加1dfs(s+1,t+a[s],count+1);//不选,回溯,不计数dfs(s+1,t,count);}intmain(){cinnk;for(inti=0;in;i++){cina[i];}dfs(0,0,0);coutsumendl;return0;}一只小跃跃




转载请注明:http://www.92nongye.com/gaishu/gaishu/204625770.html