首页 > 其他分享 >AcWing 92. 递归实现指数型枚举

AcWing 92. 递归实现指数型枚举

时间:2023-12-04 11:56:42浏览次数:33  
标签:递归 int dfs 二进制 枚举 整数 92 解法 AcWing

题面:从 \(1∼n\) 这 \(n\) 个整数中随机选取任意多个,输出所有可能的选择方案(求子集)。

原题链接:92. 递归实现指数型枚举 - AcWing

目录:

  1. 使用dfs树的解法
  2. 使用二进制与状态压缩的解法

1. 使用dfs树的解法

层级既代表递归深度也代表当前数字,左子树为该层数字,右子树为不选
dfs递归树

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

const int N = 1010;
int n;
bool st[N];

void dfs(int u) {
	if (u > n) {	//达到最大递归深度
		for (int i = 1; i <= n; i++)
			if (st[i])
				cout << i << " ";	//若该趟中数字被选中,则输出
		cout << endl;
		return;
	}
	//遍历左子树(选)
	st[u] = true;
	dfs(u + 1);
	//遍历右子树(不选)
	st[u] = false;
	dfs(u + 1);
}

int main()
{
	cin >> n;
	dfs(1);
}

2. 使用二进制与状态压缩的解法

为什么要采用二进制?

二进制每一位的0和1可以表示一个二元状态集合;
而二进制本身又表示一个整数,即可以用整数的加减表示状态之间的转移。
压缩:将一个集合压缩成了一个整数(整数作为数组下标)。

位运算的几个注意点:

① 左移乘二,右移除二;
&与判定是否为1,|异或将该位设为1。

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

const int N = 1010;
int n;

void dfs(int u, int st) {
	if (u > n) {	//达到最大递归深度
		for (int i = 1; i <= n; i++)
			if (st >> i & 1)	//st的第i位若为1
				cout << i << " ";
		cout << endl;
		return;
	}
	dfs(u + 1, st | 1 << u);	//选,把第u位变成1
	dfs(u + 1, st);				//不选,进入下一步递归
}

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

标签:递归,int,dfs,二进制,枚举,整数,92,解法,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874596.html

相关文章

  • AcWing 842. 排列数字 && AcWing 843. n-皇后问题
    842.排列数字(全排列)题面:给定一个整数\(n\),将数字\(1∼n\)排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。#include<iostream>usingnamespacestd;constintN=10;intpath[N];//保存序列boolst[N];//数字是否被用过,bool类型的全局变......
  • AcWing 828. 模拟栈
    题面:实现一个栈,栈初始为空,支持四种操作:pushx–向栈顶插入一个数\(x\);pop–从栈顶弹出一个数;empty–判断栈是否为空;query–查询栈顶元素。现在要对栈进行\(M\)个操作,其中的每个操作\(3\)和操作\(4\)都要输出相应的结果。原题链接:828.模拟栈-AcWing//......
  • AcWing 3302. 表达式求值
    题面:给定一个表达式,其中运算符仅包含加减乘除,可能包含括号,请你求出表达式的最终值。原题链接:3302.表达式求值-AcWing基本思路创建两个栈,分别存储数字和运算符运算符的判定:仅在以下条件满足时将运算符直接压入栈中:①栈中不存在元素②当前运算符优先级比栈顶高③栈顶为......
  • AcWing 154. 滑动窗口
    题面:给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动一个位置。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。原题链接:154.滑动窗口-AcWing......
  • AcWing 785. 快速排序
    题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原题链接:785.快速排序-AcWing需要注意的几个点:左右哨兵的发动顺序;相同元素的相对位置;边界划分问题[1]。#include<bits/stdc++.h>usingna......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • CF1692H Gambling 题解
    题意:思路:考虑离散化:枚举$x$中出现的每一个数$val$,$val$出现的次数为$cnt$,记录$val$每一次出现的索引$idx_i(1\lei\lecnt)$。设$x$中与$val$相等的数贡献为$+1$,与$val$不相等的数贡献为$-1$,那么问题转化为最大连续子段和。由......