组合枚举1

题目描述

写一个递归函数,枚举 1∼n 中取 m 个数的每种方法(组合枚举)。对每种方法把取出的数从小到大排序,若两种方法中前 k−1 个数相同,则第k个数更小的在前。
例如对 n = 4,m = 2,应该按如下顺序给出结果:
{1, 2},{1, 3},{1, 4},{2, 3},{2, 4},{3, 4}。

输入格式

输入共 1 行:
第 1 行,2 个正整数 n,m。

输出格式

输出共 m​ 行:
每行一个取法, 按题目要求顺序。

#include <iostream>
using namespace std;

int n, m, cnt = 0, a[25];

void dfs(int step, int last)
{
	if (step > m)
	{
		for (int i = 1; i <= m; i++)
		{
			cout << a[i] << " ";
		}
		cout << endl;
		return;
	}
	
	for (int i = last + 1; i <= n; i++)
	{
		a[step] = i;
		dfs(step + 1, i);
	}
}

int main()
{
	cin >> n >> m;
	dfs(1, 0);
	return 0;
}

组合枚举2 

题目描述

写一个递归函数,枚举 n 个数x1​,⋯,xn​ 中取 m 个数的每种方法(组合枚举)。 对每种方法把取出的数按序号从小到大排序,若两种方法中前 k−1 个数相同,则第 k 个数序号更小的在前。
例如对 n = 4,m = 2,X = {100, 20, 3, 4},应该按如下顺序给出结果:
{100, 20},{100, 3},{100, 4},{20, 3},{20, 4},{3, 4}。

输入格式

输入共 2 行:
第 1 行,2 个正整数 n,m;
第 2 行,n 个正整数 x1​,⋯,xn​。

输出格式

输出共 m​ 行:
每行一个取法, 按题目要求顺序。

#include <iostream>
using namespace std;

int n, m, cnt = 0, a1[35], a2[35];

void dfs(int step, int last)
{
	if (step > m)
	{
		for (int i = 1; i <= m; i++)
		{
			cout << a2[a1[i]] << " ";
		}
		cout << endl;
		return;
	}
	
	for (int i = last + 1; i <= n; i++)
	{
		a1[step] = i;
		dfs(step + 1, i);
	}
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a2[i];
	}
	dfs(1, 0);
	return 0;
}