ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 730|回复: 5

[求助] 排列组合问题vba求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-10-20 10:48 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 蓝色仰望 于 2021-10-20 13:01 编辑

1、1-13共13个数字
2、随机抽取7个数字排列组合
3、每相邻两个数字的差必须为(1-7)中的6种,不能重复
第三个要求意思就是相邻两数字的差从数字1到7中选6个作为差,但是不能重复,比如不能有两个差都是1这种,也不能有差是8,9这种


举个例子:
3  4   6   9   13   8   2

TA的精华主题

TA的得分主题

发表于 2021-10-20 15:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 DevilW 于 2021-10-20 16:53 编辑
  1. Sub test()
  2.     't 选7组合, s 差值, n 差组合
  3.     Set reg = CreateObject("vbscript.regexp")
  4.     reg.Global = True
  5.     reg.Pattern = "\b(\d+)\b.*?\b\1\b"
  6.     Dim br(1 To 120000, 1 To 7) '已跑一遍计数算出组合数量
  7.     For i1 = 1 To 13
  8.         For i2 = 1 To 13
  9.             t1 = i1 & "," & i2: If reg.test(t1) Then GoTo npi2 '7组合重复跳
  10.             s1 = Abs(i1 - i2): If s1 > 7 Then GoTo npi2 '差值>7跳
  11.             For i3 = 1 To 13
  12.                 t2 = t1 & "," & i3: If reg.test(t2) Then GoTo npi3
  13.                 s2 = Abs(i3 - i2): If s2 > 7 Then GoTo npi3
  14.                 n1 = s1 & "," & s2: If reg.test(n1) Then GoTo npi3 '差组合重复跳
  15.                 For i4 = 1 To 13
  16.                     t3 = t2 & "," & i4: If reg.test(t3) Then GoTo npi4
  17.                     s3 = Abs(i3 - i4): If s3 > 7 Then GoTo npi4
  18.                     n2 = n1 & "," & s3: If reg.test(n2) Then GoTo npi4
  19.                     For i5 = 1 To 13
  20.                         t4 = t3 & "," & i5: If reg.test(t4) Then GoTo npi5
  21.                         s4 = Abs(i5 - i4): If s4 > 7 Then GoTo npi5
  22.                         n3 = n2 & "," & s4: If reg.test(n3) Then GoTo npi5
  23.                         For i6 = 1 To 13
  24.                             t5 = t4 & "," & i6: If reg.test(t5) Then GoTo npi6
  25.                             s5 = Abs(i5 - i6): If s5 > 7 Then GoTo npi6
  26.                             n4 = n3 & "," & s5: If reg.test(n4) Then GoTo npi6
  27.                             For i7 = 1 To 13
  28.                                 t6 = t5 & "," & i7: If reg.test(t6) Then GoTo npi7
  29.                                 s6 = Abs(i7 - i6): If s6 > 7 Then GoTo npi7
  30.                                 n5 = n4 & "," & s6: If reg.test(n5) Then GoTo npi7
  31. '==========================================================
  32.                                 n = n + 1
  33.                                 br(n, 1) = i1
  34.                                 br(n, 2) = i2
  35.                                 br(n, 3) = i3
  36.                                 br(n, 4) = i4
  37.                                 br(n, 5) = i5
  38.                                 br(n, 6) = i6
  39.                                 br(n, 7) = i7
  40. '==========================================================
  41. npi7:
  42.                             Next
  43. npi6:
  44.                         Next
  45. npi5:
  46.                     Next
  47. npi4:
  48.                 Next
  49. npi3:
  50.             Next
  51. npi2:
  52.         Next
  53.     Next
  54.     [a1].Resize(n, 7) = br
  55. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2021-10-20 16:02 | 显示全部楼层
本帖最后由 yjh_27 于 2021-10-20 17:06 编辑

共118296组
  1. Sub aa()
  2. Dim srr(1 To 120000, 1 To 7)
  3. Dim brr(0 To 12)    '差值
  4. Dim crr(1 To 13)    '元素

  5. brr(0) = 1
  6. For i = 8 To 12
  7.     brr(i) = 1
  8. Next
  9. si = 0
  10. For i1 = 1 To 13
  11.     crr(i1) = 1
  12. For i2 = 1 To 13
  13.     If crr(i2) = 0 Then
  14.     If brr(Abs(i2 - i1)) = 0 Then
  15.     brr(Abs(i2 - i1)) = 1
  16.     crr(i2) = 1
  17. For i3 = 1 To 13
  18.     If crr(i3) = 0 Then
  19.     If brr(Abs(i3 - i2)) = 0 Then
  20.     brr(Abs(i3 - i2)) = 1
  21.     crr(i3) = 1
  22. For i4 = 1 To 13
  23.     If crr(i4) = 0 Then
  24.     If brr(Abs(i4 - i3)) = 0 Then
  25.     brr(Abs(i4 - i3)) = 1
  26.     crr(i4) = 1
  27. For i5 = 1 To 13
  28.     If crr(i5) = 0 Then
  29.     If brr(Abs(i5 - i4)) = 0 Then
  30.     brr(Abs(i5 - i4)) = 1
  31.     crr(i5) = 1
  32. For i6 = 1 To 13
  33.     If crr(i6) = 0 Then
  34.     If brr(Abs(i6 - i5)) = 0 Then
  35.     brr(Abs(i6 - i5)) = 1
  36.     crr(i6) = 1
  37. For i7 = 1 To 13
  38.     If crr(i7) = 0 Then
  39.     If brr(Abs(i7 - i6)) = 0 Then
  40.         si = si + 1
  41.         srr(si, 1) = i1
  42.         srr(si, 2) = i2
  43.         srr(si, 3) = i3
  44.         srr(si, 4) = i4
  45.         srr(si, 5) = i5
  46.         srr(si, 6) = i6
  47.         srr(si, 7) = i7
  48.     End If
  49.     End If
  50. Next i7
  51.     brr(Abs(i6 - i5)) = 0
  52.     crr(i6) = 0
  53.     End If
  54.     End If
  55. Next i6
  56.     brr(Abs(i5 - i4)) = 0
  57.     crr(i5) = 0
  58.     End If
  59.     End If
  60. Next i5
  61.     brr(Abs(i4 - i3)) = 0
  62.     crr(i4) = 0
  63.     End If
  64.     End If
  65. Next i4
  66.     brr(Abs(i3 - i2)) = 0
  67.     crr(i3) = 0
  68.     End If
  69.     End If
  70. Next i3
  71.     brr(Abs(i2 - i1)) = 0
  72.     crr(i2) = 0
  73.     End If
  74.     End If
  75. Next i2
  76.     crr(i1) = 0
  77. Next i1

  78. Range("a1").Resize(si, 7) = srr
  79. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2021-10-20 16:06 | 显示全部楼层
本帖最后由 DevilW 于 2021-10-20 16:53 编辑

118296组,不计次序

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-10-21 09:36 | 显示全部楼层
DevilW 发表于 2021-10-20 16:06
118296组,不计次序

感谢大神的帮助,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-10-21 09:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 07:25 , Processed in 0.039117 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表