求组合数

求组合数

从n个数里面取m个数 (递归实现)

/**
 * Description:
 * 求组合数(递归法)
 * 从n个数里面取m个数 算法分析:
 * 用递归的方法,每选出一个数字之后就把这个数字去掉,用剩余的数字继续递归
 * @author cm
 * 
 */
public class Combination 
{
	private int m;	
	private int[] res;	//存放结果数组
	private int[] arr;	//被选择的数组
	private int count = 0;
	private int total = 0; //总数

	/**
	 * @param m   选择的个数
	 * @param arr 被选择的数组
	 *
	 */
	public Combination(int m, int[] arr)
	{
		this.m = m;
		this.arr = arr;
		res = new int[m];
	}

	/**
	 * 求组合数
	 */
	public void combination()
	{
		comb(0);
	}
	
	/**
	 * @param start 递归调用的开始下标
	 */
	private void comb(int start)
	{
		if (count == m)
		{
			print();
			total++;
			return;
		}
		
		for (int i = start; i < arr.length; i++)
		{
			res[count] = arr[i];
			count++;
			comb(i+1);	//递归调用
			count--;
		}
	}

	//打印结果
	private void print()
	{
		for (int i = 0; i < res.length; i++)
		{
			System.out.print(res[i] + " ");
		}
		System.out.println();
	}

	/**
	 * @return 返回组合数的个数
	 */
	public int getTotal()
	{
		return total;
	}

	
	public static void main(String[] args) 
	{
		int[] arr = {1,2,3,4,5,6,7,8,9};
		//9选7
		Combination comb = new Combination(7,arr);
		comb.combination();
		System.out.println(comb.getTotal());
		
	}
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值