【递归】组队选择

这篇博客探讨了一道递归算法题,要求从1到n编号的人员中选择k个人,使得编号之和等于m,并按降序输出所有方案。通过递归方法,从n开始循环选择,满足条件时输出结果。
摘要由CSDN通过智能技术生成

【递归】组队选择

此题为递归算法题,题目来源计科老班

题目描述

逸才奉道玄掌门之命率领青云众弟子深入蛮荒之地寻找灵兽黄鸟,完成使命后率队需经过焚香谷镇守的幽暗小道。焚香谷门卫给一行人由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();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值