组合型枚举和排列型枚举

一.组合型枚举

1.给两个数字n和m,从1-n中取m个数字的所有情况

方法1:用到了dfs搜索,深度优先搜索每条路径。

//组合形式枚举
//只用组合不用排列
#include<iostream>
using namespace std;
int n,m;
int path[50];
int cnt=0;            //path用来储存当前路径上的数字 
void dfs(int u,int start)
{
	if(u>m)
	{
		for(int i=1;i<=m;i++)
		{
			cout<<path[i]<<" ";
		}
		cout<<endl;
		cnt++;
		return;
	}
	for(int i=start;i<=n;i++)
	{
		path[u]=i;
		dfs(u+1,i+1);      //用递归依次往下取
	}
}
int main()
{
	cin>>n>>m;
	dfs(1,1);
	cout<<cnt<<endl;
	return 0;
 } 

方法2:每个数字都分为选和不选两种情况。

#include<iostream>
#include<vector>
using namespace std;
vector<int>chose; 
int n,m;
void ser(int x )
{
	if(chose.size()>m||chose.size()+(n-x+1)<m)  //剪枝 
		return;//若选择的数超过范围或者已选的和剩下的加在一起不到m 
		       //则不能满足题意,返回。
	if(x>n)    //到底再输出
		{
			for(int i=0;i<chose.size();i++)
				cout<<chose[i];
			cout<<endl;
			return;
		}
	chose.push_back(x);//第x个数选
	ser(x+1);//进入下一层
	chose.pop_back();//第x个数不选
	ser(x+1);//进入下一层
}             
int main()
{
	cin>>n>>m;
	ser(1);//从第1个数开始
}

全部评论

相关推荐

点赞 评论 收藏
分享
07-15 00:33
江苏大学 Java
代码飞升:哈哈哈哈评论区三个打广告的
简历中的项目经历要怎么写
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务