[算法] 采用递归回溯法设计一个算法求1~n的n个整数中取出m个元素的排列,要求每个元素最多只能取一次。

问题描述:采用递归回溯法设计一个算法求 1 ~ n 1~n 1n n n n个整数中取出 m m m个元素的排列,要求每个元素最多只能取一次。例如, n = 3 n=3 n=3 m = 2 m=2 m=2的输出结果是 ( 1 , 2 ) , ( 1 , 3 ) , ( 2 , 1 ) , ( 2 , 3 ) , ( 3 , 1 ) , ( 3 , 2 (1,2),(1,3),(2,1),(2,3),(3,1),(3,2 121321233132)。


思路一:

  1. 先用递归法从 n n
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
算法设计与分析 作者-王红梅 出版社-清华大学出版社 出版日期-07 1 2006. 共262页 目录 第 1 章 绪论 1 .1 算法的基本概念 1 . 1 . 1 为什么要学习算法 1 . 1 . 2 算法及其重要特性 1 . 1 . 3 算法的描述方 1 . 1 . 4 算法设计的一般过程 1 . 1 . 5 重要的问题类型 1 .2 算法分析 1 . 2 . 1 渐进符号 1 . 2 . 2 最好、 最坏和平均情况 1 . 2 . 3 非递归算法的分析 1 . 2 . 4 递归算法的分析 1 . 2 . 5 算法的后验分析 1 .3 实验项目— — —最大公约数 阅读材料— — —人工神经网络与 BP 算法 习题 1 第 2 章 NP 完全理论 2 .1 下界 2 . 1 . 1 平凡下界 2 . 1 . 2 判定树模型 2 . 1 . 3 最优算法 2 .2 算法的极限 2 . 2 . 1 易解问题与难解问题 2 . 2 . 2 实际问题难以解的原因 2 . 2 . 3 不可解问题 2 .3 P 类问题和 NP 类问题 2 .3 .1 判定问题 2 .3 .2 确定性算法与 P 类问题 2 .3 .3 非确定性算法与 NP 类问题 2 .4 NP 完全问题 2 .4 .1 问题变换与计算复杂性归约 2 .4 .2 NP 完全问题的定义 2 .4 .3 基本的 NP 完全问题 2 .4 .4 NP 完全问题的计算机处理 2 .5 实验项目— — —SAT 问题 阅读材料— — —遗传算法 习题 2 第 3 章 蛮力 3 .1 蛮力设计思想 3 .2 查找问题的蛮力 3 .2 .1 顺序查找 3 .2 .2 串匹配问题 3 .3 排序问题的蛮力 3 .3 .1 选择排序 3 .3 .2 起泡排序 3 .4 组合问题的蛮力 3 .4 .1 生成排列对象 3 .4 .2 生成子集 3 .4 .3 0 / 1 背包问题 3 .4 .4 任务分配问题 3 .5 图问题的蛮力 3 .5 .1 哈密顿回路问题 3 .5 .2 TSP 问题 3 .6 几何问题的蛮力 3 .6 .1 最近对问题 3 .6 .2 凸包问题 3 .7 实验项目— — —串匹配问题 阅读材料— — —蚁群算法 习题 3 第 4 章 分治 4 .1 概述 4 .1 .1 分治设计思想 4 .1 .2 分治解过程 4 .2 递归 4 .2 .1 递归的定义 4 .2 .2 递归函数的运行轨迹 4 .2 .3 递归函数的内部执行过程 4 .3 排序问题的分治 4 .3 .1 归并排序 4 .3 .2 快速排序 4 .4 组合问题的分治 4 .4 .1 最大子段和问题 4 .4 .2 棋盘覆盖问题 4 .4 .3 循环赛日程安排问题 4 .5 几何问题的分治 4 .5 .1 最近对问题 4 .5 .2 凸包问题 4 .6 实验项目— — —最近对问题 阅读材料— — —鱼群算法 习题 4 第 5 章 减治 5 .1 减治设计思想 5 .2 查找问题的减治 5 .3 排序问题的减治 5 .4 组合问题的减治 5 .5 实验项目— — —8 枚硬币问题 阅读材料— — —粒子群算法 习题 5 第 6 章 动态规划 6 .1 概述 6 .2 图问题的动态规划 6 .3 组合问题的动态规划 6 .4 查找问题的动态规划 6 .5 实验项目— — —最大子段和问题 阅读材料— — —文化算法 习题 6 第 7 章 贪心 7 .1 概述 7 .2 图问题的贪心 7 .3 组合问题的贪心 7 .4 实验项目— — —霍夫曼编码 阅读材料— — —模拟退火算法 习题 7 第 8 章 回溯法 8 .1 概述 8 .2 图问题回溯法 8 .3 组合问题回溯法 8 .4 实验项目— — —0/ 1 背包问题 阅读材料— — —禁忌搜索算法 习题 8 第 9 章 分支限界 9 .1 概述 9 .2 图问题的分支限界 9 .3 组合问题的分支限界 9 .4 实验项目— — —电路布线问题 阅读材料— — —免疫算法 习题 9 第 10 章 概率算法 10 .1 概述 10 .1 .1 概率算法设计思想 10 .1 .2 随机数发生器 10 .2 舍伍德(Sherwood)型概率算法 10 .2 .1 快速排序 10 .2 .2 选择问题 10 .3 拉斯维加斯( Las Vegas)型概率算法 10 .3 .1 八皇后问题 10 .3 .2 整数因子分解问题 10 .4 蒙特卡罗(Monte Ca rlo)型概率算法 10 .4 .1 主元素问题 10 .4 .2 素数测试问题 10 .5 实验项目— — —随机数发生器 阅读材料— — —DNA 计算与 DNA 计算机 习题 10 第 11 章 近似算法 11 .1 概述 11 .1 .1 近似算法设计思想 11 .1 .2 近似算法的性能 11 .2 图问题的近似算法 11 .2 .1 顶点覆盖问题 11 .2 .2 TSP 问题 11 .3 组合问题的近似算法 11 .3 .1 装箱问题 11 .3 .2 子集和问题 11 .4 实验项目— — —TSP 问题的近似算法 阅读材料— — —量子密码技术 习题 11 第 12 章 计算复杂性理论 12 .1 计算模型 12 .1 .1 图灵机的基本模型 12 .1 .2 k 带图灵机和时间复杂性 12 .1 .3 离线图灵机和空间复杂性 12 .2 P 类问题和 NP 类问题 12 .2 .1 非确定性图灵机 12 .2 .2 P 类语言和 NP 类语言 12 .3 NP 完全问题 12 .3 .1 多项式时间变换 12 .3 .2 Cook 定理 12 .4 实验项目— — —NP 完全问题树 阅读材料— — —算法优化策略
好的,我了解了你的问题。下面是 C++ 的递归回溯法实现: ```c++ #include <iostream> #include <vector> using namespace std; void backtrack(vector<int>& res, vector<int>& nums, int m) { if (res.size() == m) { for (int i = 0; i < m; i++) { cout << res[i] << " "; } cout << endl; return; } for (int i = 0; i < nums.size(); i++) { if (find(res.begin(), res.end(), nums[i]) != res.end()) { continue; } res.push_back(nums[i]); backtrack(res, nums, m); res.pop_back(); } } int main() { int n = 3, m = 2; vector<int> res, nums(n); for (int i = 0; i < n; i++) { nums[i] = i + 1; } backtrack(res, nums, m); return 0; } ``` 该算法的基本思想是利用递归回溯法生成所有可能的排列,具体实现如下: - 定义一个 res 数组,用于存储当前已经选择的数字。 - 如果 res 数组的长度为 m,说明已经选择了 m 个数字,输出当前排列并返回。 - 枚举 nums 数组的每个数字,如果该数字已经在 res 数组出现过了,则跳过。 - 将当前数字添加到 res 数组。 - 递归调用 backtrack 函数,从剩余的数字继续选择数字。 - 在递归返回后,将 res 数组的最后一个数字弹出,开始枚举下一个数字。 对于 n=3,m=2 的情况,算法的输出如下: ``` 1 2 1 3 2 1 2 3 3 1 3 2 ``` 实验分析: 该算法的时间复杂度为 O(n!),其 n 表示待排列的元素个数。该算法的空间复杂度为 O(n),即存储当前排列的数组的长度。当 n 的值较大时,该算法的时间复杂度会非常高,因此不适用于大规模的排列问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值