`
cjc
  • 浏览: 658782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

回溯实现数字的排列组合

 
阅读更多

从1--m中选n个数字的排列组合的简单实现,速度还可以:


Sub getall(ByVal m As Byte, ByVal n As Byte, Optional types As Byte = 0)'types=0为排列 types=1 为组合
Dim num As Long, i As Integer, k As Integer, a(), s() As String
ReDim a(1 To n)
k = 1
Do
a(k) = a(k) + 1
If a(k) > m Then
k = k - 1
Else
For i = 1 To k - 1
If a(k) = a(i) Then Exit For
Next
If i = k Then
If k = n Then
num = num + 1
ReDim Preserve s(1 To num)
s(num) = Join(a, ",")
End If
If k < n Then k = k + 1: a(k) = a(k - 1) * types

End If
End If
Loop Until k = 0
Debug.Print Join(s, vbTab)
End Sub

Sub getit()
getall 8, 3, 1 '组合
Debug.Print
getall 8, 3 '排列
End Sub

 

返回:

1,2,3   1,2,4   1,2,5   1,2,6   1,2,7   1,2,8   1,3,4   1,3,5   1,3,6   1,3,7   1,3,8   1,4,5   1,4,6   1,4,7   1,4,8   1,5,6   1,5,7   1,5,8   1,6,7   1,6,8   1,7,8   2,3,4   2,3,5   2,3,6   2,3,7   2,3,8   2,4,5   2,4,6   2,4,7   2,4,8   2,5,6   2,5,7   2,5,8   2,6,7   2,6,8   2,7,8   3,4,5   3,4,6   3,4,7   3,4,8   3,5,6   3,5,7   3,5,8   3,6,7   3,6,8   3,7,8   4,5,6   4,5,7   4,5,8   4,6,7   4,6,8   4,7,8   5,6,7   5,6,8   5,7,8   6,7,8

1,2,3   1,2,4   1,2,5   1,2,6   1,2,7   1,2,8   1,3,2   1,3,4   1,3,5   1,3,6   1,3,7   1,3,8   1,4,2   1,4,3   1,4,5   1,4,6   1,4,7   1,4,8   1,5,2   1,5,3   1,5,4   1,5,6   1,5,7   1,5,8   1,6,2   1,6,3   1,6,4   1,6,5   1,6,7   1,6,8   1,7,2   1,7,3   1,7,4   1,7,5   1,7,6   1,7,8   1,8,2   1,8,3   1,8,4   1,8,5   1,8,6   1,8,7   2,1,3   2,1,4   2,1,5   2,1,6   2,1,7   2,1,8   2,3,1   2,3,4   2,3,5   2,3,6   2,3,7   2,3,8   2,4,1   2,4,3   2,4,5   2,4,6   2,4,7   2,4,8   2,5,1   2,5,3   2,5,4   2,5,6   2,5,7   2,5,8   2,6,1   2,6,3   2,6,4   2,6,5   2,6,7   2,6,8   2,7,1   2,7,3   2,7,4   2,7,5   2,7,6   2,7,8   2,8,1   2,8,3   2,8,4   2,8,5   2,8,6   2,8,7   3,1,2   3,1,4   3,1,5   3,1,6   3,1,7   3,1,8   3,2,1   3,2,4   3,2,5   3,2,6   3,2,7   3,2,8   3,4,1   3,4,2   3,4,5   3,4,6   3,4,7   3,4,8   3,5,1   3,5,2   3,5,4   3,5,6   3,5,7   3,5,8   3,6,1   3,6,2   3,6,4   3,6,5   3,6,7   3,6,8   3,7,1   3,7,2   3,7,4   3,7,5   3,7,6   3,7,8   3,8,1   3,8,2   3,8,4   3,8,5   3,8,6   3,8,7   4,1,2   4,1,3 
4,1,5   4,1,6   4,1,7   4,1,8   4,2,1   4,2,3   4,2,5   4,2,6   4,2,7   4,2,8   4,3,1   4,3,2   4,3,5   4,3,6   4,3,7   4,3,8   4,5,1   4,5,2   4,5,3   4,5,6   4,5,7   4,5,8   4,6,1   4,6,2   4,6,3   4,6,5   4,6,7   4,6,8   4,7,1   4,7,2   4,7,3   4,7,5   4,7,6   4,7,8   4,8,1   4,8,2   4,8,3   4,8,5   4,8,6   4,8,7   5,1,2   5,1,3   5,1,4   5,1,6   5,1,7   5,1,8   5,2,1   5,2,3   5,2,4   5,2,6   5,2,7   5,2,8   5,3,1   5,3,2   5,3,4   5,3,6   5,3,7   5,3,8   5,4,1   5,4,2   5,4,3   5,4,6   5,4,7   5,4,8   5,6,1   5,6,2   5,6,3   5,6,4   5,6,7   5,6,8   5,7,1   5,7,2   5,7,3   5,7,4   5,7,6   5,7,8   5,8,1   5,8,2   5,8,3   5,8,4   5,8,6   5,8,7   6,1,2   6,1,3   6,1,4   6,1,5   6,1,7   6,1,8   6,2,1   6,2,3   6,2,4   6,2,5   6,2,7   6,2,8   6,3,1   6,3,2   6,3,4   6,3,5   6,3,7   6,3,8   6,4,1   6,4,2   6,4,3   6,4,5   6,4,7   6,4,8   6,5,1   6,5,2   6,5,3   6,5,4   6,5,7   6,5,8   6,7,1   6,7,2   6,7,3   6,7,4   6,7,5   6,7,8   6,8,1   6,8,2   6,8,3   6,8,4   6,8,5   6,8,7   7,1,2   7,1,3   7,1,4   7,1,5 
7,1,6   7,1,8   7,2,1   7,2,3   7,2,4   7,2,5   7,2,6   7,2,8   7,3,1   7,3,2   7,3,4   7,3,5   7,3,6   7,3,8   7,4,1   7,4,2   7,4,3   7,4,5   7,4,6   7,4,8   7,5,1   7,5,2   7,5,3   7,5,4   7,5,6   7,5,8   7,6,1   7,6,2   7,6,3   7,6,4   7,6,5   7,6,8   7,8,1   7,8,2   7,8,3   7,8,4   7,8,5   7,8,6   8,1,2   8,1,3   8,1,4   8,1,5   8,1,6   8,1,7   8,2,1   8,2,3   8,2,4   8,2,5   8,2,6   8,2,7   8,3,1   8,3,2   8,3,4   8,3,5   8,3,6   8,3,7   8,4,1   8,4,2   8,4,3   8,4,5   8,4,6   8,4,7   8,5,1   8,5,2   8,5,3   8,5,4   8,5,6   8,5,7   8,6,1   8,6,2   8,6,3   8,6,4   8,6,5   8,6,7   8,7,1   8,7,2   8,7,3   8,7,4   8,7,5   8,7,6

分享到:
评论

相关推荐

    leetcode岛屿的最大面积-LeetCode:标记我在https://leetcode.com/上练习的问题的解决方案

    有重复元素下的排列组合 数字组合 找出集和中和等于特殊值的子集和 含有相同元素的集和,找和为特殊值的子集和 集和中寻找和为特殊值的子集和 两个有序数组的中位数 [4. 寻找两个有序数组的中位数]

    LeetCode解题总结

    1.7 下一个排列 1.8 第n个全排列 1.9 验证数独的正确性 1.10 容纳雨水的量 1.11 旋转图像 1.12 数字加1 1.13 爬楼梯 1.14 格雷码 1.15 设置矩阵的行列为0 1.16 加油站问题 1.17 分糖果 1.18 只出现一次的数 2. ...

    网格最短leetcodePython-LeetCode:力码

    数字老鼠leetcode Python 5. 最长回文子串 (Reference: https://leetcode.com/problems/longest-palindromic-substring/solution/) 解决方案 日期 最长公共子串 6/24 蛮力 6/24 动态规划 8/14 围绕中心展开 8/12 92....

    leetcode104-goes:golangex

    给定随机罗马数字字符串计算代表整数。哈希表 找出字符串数组中最长的公共前缀。水平扫描 垂直扫描 分治法 二分查找 括号字符串检查是否配对。栈 实现substr。暴力法,kmp 查找元素在数组中的位置,如果不存在则返回...

    判断链表是否为回文链表leetcode-JAVA-coding-interview-Balazs:leetcode.com,algoexper

    回溯(排列 & 组合 & 子集...等) 数学 和更多... 来自的问题 玻璃门 采访 ... 尖端 检查这个先发帖。 每当您使用一些新技术/算法解决新问题时,请尝试连续解决至少 2 个类似的问题。 这样,您对新技术/算法的理解会...

    leetcode中文版-LeetCode:算法练习:LeetCode问题、LeetCode每周竞赛等

    排列、组合、分割、子集:四大类问题,常用回溯、DFS解决 图的搜索:DFS、BFS、并查集、Flood 并查集(TODO) 二分查找: g 函数,利用边界 K th 问题 旋转数组 双指针: 左右指针:数组(或字符串)问题,二分查找...

    lrucacheleetcode-LeetcodeSolution:Leetcode刷题的分类和答案记录

    回溯 17.电话号码的字母组合 22.生成括号 39.组合和 40.组合和II 46.排列 78.子集 79.词搜索 二分查找 33.在旋转排序数组中搜索 34.在有序数组中查找元素的首尾位置 35.搜索插入位置 动态规划 10.正则表达式匹配 32....

    javalruleetcode-leetcode-diary:leetcode刷题记录

    电话号码的字母组合 #17 四数之和 #18 删除链表的倒数第N个节点 #19 有效的括号 #20 合并两个有序链表 #21 *括号生成 #22 合并K个排序链表 #23 两两交换链表中的节点 #24 K 个一组翻转链表 #25 删除排序数组中的重复...

    C#编程经验技巧宝典

    100 &lt;br&gt;0158 如何将二进制数转换为十六进制数 100 &lt;br&gt;0159 如何实现0~9之间随机整数 101 &lt;br&gt;0160 如何实现0~1之间随机数 101 &lt;br&gt;0161 如何返回数字的绝对值 101 &lt;br&gt;5.2 控件数据处理...

    lrucacheleetcode-coderust:使用coderust破解编码面试

    回溯 动态规划 各种各样的 附录 问题详情 数组 二分查找 - , 找到最大滑动窗口 - 搜索旋转数组 - 找到最小的公数 - 旋转阵列 - 查找低/高指数 - 向左移动零 - 找到最大单笔卖出利润 - 实施快速排序 - 合并重叠区间 -...

    算法分析与设计习题集答案

    36、 (组合问题)求出从自然数1,2,…,n中任取r个数的所有组合。 37、 传教士与野人渡河问题。有M个传教士和M个野人准备渡河,船一次最多载2人,任何时刻野人数不能多于传教士数,但允许全部为野人。编写算法给出...

    2009达内SQL学习笔记

    多个字段组合时,只排除组合重复的。 DISTINCT必须使用列名,不能使用计算或者表达式。 所有的聚合函数都可以使用。如果指定列名,则DISTINCT只能用于COUNT(列名),DISTINCT不能用于COUNT(*)。 如:Select ...

    LINGO软件的学习

    集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。 注意:该命名规则同样适用...

Global site tag (gtag.js) - Google Analytics