使用递归算法简单实现元素的全排列和选择排列(组合)
该算法可以指定各元素的使用次数
public class 选择排列 {
static char[] yu= {'a','b','c','d','e'};
static int [] num= {1,1,1,1,1};
static void dfs0(int step, int n,String s) { //从m个元素选择n个,并考虑顺序
if (step==n) {//num元素之和
System.out.println(s);
return;
}
for (int i = 0; i < yu.length; i++) {
if (num[i]>0) {
num[i]--;
dfs0(step+1,n,s+yu[i]);
num[i]++;
}
}
}
static void dfs(int pos, int cnt, int n, int k,String s) {//从n个元素选择k个,不考虑顺序
if (cnt == k) { //已标记了k个数,输出结果
System.out.println(s);
return;
}
if (pos == n) return;//处理到最后一个数,直接返回
if (num[pos]>0) {//如果yu[pos]还可以选
num[pos]--; //选中yu[pos]
dfs(pos, cnt + 1, n, k, s+yu[pos]);
num[pos]++; //回溯
}
dfs(pos + 1, cnt, n, k, s);
}
public static void main(String args[]) {
dfs0(0,2,"");
System.out.println("");
dfs(0,0,5,2,"");
}
}
运行结果
ab
ac
ad
ae
ba
bc
bd
be
ca
cb
cd
ce
da
db
dc
de
ea
eb
ec
ed
ab
ac
ad
ae
bc
bd
be
cd
ce
de