从m个数中任意去n个数的组合

总共有m个数字,从m个数字中找出n个数字的组合。

 

int b[100];
int m=10;//总共10个数字 0,1,2,3,4,5,6,7,8,9
int n=4;//选择4个数字 
//从m中选取n个数 i表示当前选择的个数 i==n时候输出 k表示从第k个数字开始
void com(int i,int k)
{
	if(i<n)
	{
		for(int j=k;j<=m-n+i;j++)//从k到m-n+i中找组合
		{
			b[i]=j;
			com(i+1,j+1);
		}
	}
	else
	{
		for(int p=0;p<n;p++)
			cout<<b[p]<<" ";
		cout<<endl;
	}
}


 调用

com(0,0)

 

上述的方案 看起来十分粗糙,下面是改进的方案。

n为组合包含元素个数, cur当前包含个数,col数组 id为编号
#define len 9
void test2(int n,int cur,std::vector<int> col,int id)
{
 	if(cur==n)
	{
		vector<int>::iterator iter=col.begin();
		for(;iter!=col.end();iter++)
		{
			cout<<*iter<<" ";
		}
		cout<<endl;
	}
	else
	{
		for(int k=id;k<len;k++)
		{
			col.push_back(k);
			test2(n,cur+1,col,k+1);
			col.pop_back();
		}
	}
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值