DFS 输出从n个数中选m个数的全部情况

#include<bits/stdc++.h>
using namespace std;

int vis[10], n = 4, m = 3;

void dfs (int x, int sum) {
	if (x > n) return ; // 不是 x>=n!!! // 因为x=n说明轮到了选或不选第n个数,但是没判断此时sum的值  // 还有一种办法是将该语句放在if(sum == m)判断后
	if (sum == m) {
		for (int i = 0;i < n;i ++) 
			if (vis[i]) 
				cout << i << ' ';
		cout << endl;
		return ;
	}
	
	vis[x] = 1;
	dfs (x+1, sum + 1); 
	vis[x] = 0;
	dfs (x+1, sum);
}

int main()
{
	dfs (0, 0);	
	// 0~n-1
	// 从 n 个数中选 m 个数的全部情况。罗列出C(n,m)的全部情况 
	// 使用情形:比较暴力,枚举全部的可能。 

	return 0;
}

整体思路是对于第x个数选还是不选。

这是一个暴力模板,这个与全排列的区别在于,全排列是区分顺序的,而该模板对于选出的m个数是不区分顺序的。

因此,确定方案数的题(蓝桥杯)只有四种可能:

  • 普通多层循环
  • DFS 暴力枚举
  • 全排列(next_permutation)
  • 动态规划
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不牌不改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值