B3623 枚举排列 題解
ShanCreeperPro · · 题解
B3623 枚举排列 題解
如果您做完了此题,您可以尝试:
B3621 枚举元组
B3622 枚举子集
B3624 猫粮规划
题目大概的意思就是从
这和枚举元组和枚举子集不一样的是,一个人在一个方案中只能出现一次。
方法1: 枚举所有方案后排除非法方案。
我们可以直接枚举
时间复杂度为
所以我们要想其他的方法。
方法2: 使用一种方法判断该数是否使用过。
我们可以用
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | 2 | ? |
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 |
在这个例子中,数字 1 和 2 已经被使用,所以对应的
可以写一个 dfs 函数来完成此题。
- 定义数组
a 存储枚举的数列,其中a_i 表示第i 位的数字; - 定义数组
use 记录已经使用过的数字,其中在use_i 中如果为 1 则为使用过,否则为未使用; - 在发现
use_i=0 时,把i 存入a_i ,将use_i 标记为 1,递归下一个数字,递归完成后要将use_i 标记为 0;
这就是我们的 dfs 函数。
管理员注:
由于课程需要本题不展示代码。
如需系统学习相关知识点请报名【洛谷-基础算法计划】