列举出几个数字形成的组合情况,是一种很常见的问题。
用Java写了一个还算通用的列举出所有组合情况的代码。
问题:从0,1,2,...(n-1)数中,选择m个数,问总共有多少种情况,分别是什么样的?
方法:(1)模拟人工考虑组合情况,先建立一个m大小的堆栈,用来存放选取的数字。
(2)根据大小,依次选择m个数字,压入栈中。如果栈满了,就说明形成了一组组合情况。
(3)形成一个组合后,弹出最后一个数a,压入一个a+1,就形成了一个新的组合。以此类推。
(4)如果栈顶的数字为(n-1),那么其下一个组合需要改变形成组合的(m-1)个数字,应该是其加1。然后重复步骤(2)。
(5)当组合数形成(n-1-m),(n-m),.....,(n-1)的时候,就是最后一组m个数字的组合了,就可以停止寻找了。
【注意】这个代码在计算C(n,1)的时候,会缺少只取第一个数字0的情况,不过只有这个例外情况,可以在实际应用的时候添加写代码来解决。
代码如下:(代码中计算了C(16,8)的情况。
public class Ccnm{
public in