【递归】组队选择
此题为递归算法题,题目来源计科老班
题目描述
逸才奉道玄掌门之命率领青云众弟子深入蛮荒之地寻找灵兽黄鸟,完成使命后率队需经过焚香谷镇守的幽暗小道。焚香谷门卫给一行人由1至n进行了编号,并有意为难让逸才选出k个人组成一队,他们的编号之和恰好等于m。逸才笑了笑说:“组队选择有许多种,你们要哪种?”焚香谷门卫顿时懵了,不知所措地说:“你们按号码降序输出所有方案吧。”
输入
输入一行三个数字n,k和m。(n<=100, k<=10,m<=1000)
输出
按号码降序输出所有组队方案,每个号码后面输出一个空格(包括最后一个数),每组数据占一行。
样例输入
10 3 11
样例输出
2 4 5
2 3 6
1 4 6
1 3 7
1 2 8
思路详解
这一题是组合的变题,从n个数中选择k个数进行组合,同时满足k个数的和为m的情况,并且以降序输出。从k个数的第一个位置开始递归,由于降序,所以从n开始循环,以此类推,直到选满k个数为止。然后在程序中添加判断,判断k个数的值的和等于m时,才输出结果
代码
import java.util.Scanner;
public class TeamSelection {
int n,m,K;
int[] A;
//boolean[] Mark;
public TeamSelection() {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
K=sc.nextInt();
A=new int[m+1];
A[0]=0;
Search(1);
}
void Search(int pos) {
if(pos>m) {
//全部数字已排列
int sum=0;
for(int k=1;k<=m;k++) sum+=A[k];
if(sum!=K) return;
for(int k=1;k<=m;k++)
System.out.print(A[k]+" ");
System.out.println();
return;
}
for(int i=n;i>=A[pos-1]+1;i--) { //降序
A[pos]=i;
Search(pos+1);
}
}
public static void main(String[] args ) {
TeamSelection p=new TeamSelection();
}
}