cnm输出从n个里取m个的所有组合(递归)

输入种数n,输出从中取m个不同种的所有组合(cnm):

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
vector<int> tv;   //(也可以开一个不大于题面给的m最大值的数组)用于暂时存放每种可能而被反复使用的 vector 
int sum=0;

函数部分:

void sumOf(int n,int m)
{	for(int i=n-1;i>=m-1;--i)    	//注意一下:单次for循环中的n和m都是不变的 	{		if(m==1)   //如果此次for循环中的m==1就终止此次递归,在当前递归中循环执行if中的内容 		{			tv[m-1]=v[i];			for(auto it=tv.begin();it!=tv.end();++it)			{				cout<<*it<<" ";			}			cout<<endl;			++sum;		}		else   //若此次for循环中m-1>0,就每将该元素固定后进行下一元素的判断 		{			tv[m-1]=v[i];			sumOf(i,m-1);   //当前循环已经是i=n-1了,但注意此处不能用n-1 		}	}}

主函数:

int main()
{	int n,m;	cin>>n>>m;	tv.resize(m);	for(int i=0;i<n;++i)	{		int num;		cin>>num;		v.push_back(num);	}	sumOf(n,m);	cout<<sum<<endl;}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值