Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 7388|回复: 21

[已解决]挑选数据组合

[复制链接]
发表于 2014-2-14 20:04 | 显示全部楼层 |阅读模式
本帖最后由 mmc998 于 2014-2-15 20:29 编辑

Book六码组合.rar (7.37 KB, 下载次数: 38)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-14 20:26 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2014-2-14 20:29 | 显示全部楼层
tgydslr 发表于 2014-2-14 20:26
坐上沙发等着欣赏

麻烦高手了
回复

使用道具 举报

发表于 2014-2-15 06:48 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, zf$, w(0 To 9)
  3. Dim i%, i1%, i2%, i3%, i4%, i5%, i6%, s&
  4. t = Timer
  5. arr = Range("a2").CurrentRegion
  6. zf = Space(23)
  7. For i1 = 1 To UBound(arr) - 5
  8.     Mid$(zf, 1, 3) = arr(i1, 1)
  9.     For i2 = i1 + 1 To UBound(arr) - 4
  10.         Mid$(zf, 5, 3) = arr(i2, 1)
  11.         For i3 = i2 + 1 To UBound(arr) - 3
  12.             Mid$(zf, 9, 3) = arr(i3, 1)
  13.                 For i4 = i3 + 1 To UBound(arr) - 2
  14.                     Mid$(zf, 13, 3) = arr(i4, 1)
  15.                     For i5 = i4 + 1 To UBound(arr) - 1
  16.                         Mid$(zf, 17, 3) = arr(i5, 1)
  17.                         For i6 = i5 + 1 To UBound(arr)
  18.                             Mid$(zf, 21, 3) = arr(i6, 1)
  19.                             p = Replace(zf, " ", "")
  20.                             GoSub line1
  21.                             If Join(w, "") = String(9, "2") Then s = s + 1: Cells(s, 3) = zf
  22.                             If s = 6 Then MsgBox Timer - t: Exit Sub
  23.                             Erase w
  24. Next i6, i5, i4, i3, i2, i1
  25. Exit Sub
  26. line1:
  27. For i = 1 To Len(p)
  28.     x = Val(Mid$(p, i, 1))
  29.     w(x) = w(x) + 1
  30. Next
  31. Return
  32. End Sub
复制代码
代码运行速度很慢,要几分钟,请高手优化
6组结果:
012 013 234 456 578 678
012 013 234 456 579 679
012 013 234 456 589 689
012 013 234 457 568 678
012 013 234 457 569 679
012 013 234 457 589 789




回复

使用道具 举报

发表于 2014-2-15 06:54 | 显示全部楼层
……………………

Book六码组合.zip

11.61 KB, 下载次数: 4

回复

使用道具 举报

发表于 2014-2-15 13:42 | 显示全部楼层
楼主的题目是:
从0-9这10个数中任取9个数的全部组合,
然后这9个数乘以2=18个数(保证每个数出现2次),
最后把这18个数分成6个不同的组合(每个组合中数字只出现1次)。


呵呵,根据这个设计算法,可能速度会快很多。
回复

使用道具 举报

发表于 2014-2-15 13:53 | 显示全部楼层
只要先计算1-9的全部结果,
然后把1-9分别置换为0就可以得到全部6码组合结果。
回复

使用道具 举报

发表于 2014-2-15 14:15 | 显示全部楼层
这个应该用递归做比较简单吧。用空研究一下。
回复

使用道具 举报

发表于 2014-2-15 18:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 香川群子 于 2014-2-15 19:17 编辑

  1. Dim sj&(), sj2$(), jc&(), jg$(), c&, m1&, n1&, m2&, n2&, k&, cnt&, tms#, cnt2&
  2. Sub kagawa()
  3.     tms = Timer
  4.     [a1].CurrentRegion.Offset(1) = ""
  5.    
  6.     m1 = 9: n1 = 3
  7.     k = Application.Combin(m1, n1) 'k=84
  8.     ReDim sj&(1 To k, 1 To n1)  'Get Combin(9,3)
  9.     ReDim sj2$(1 To k) 'Get Combin(9,3)
  10.     k = 0: Call dgZH1("", 0, 1)
  11.    
  12.     ReDim jc&(1 To m1)
  13.    
  14.     m2 = k: n2 = 6: c = 2
  15.     k = Application.Combin(m2, n2) 'k=406,481,544
  16.     cnt = 10 ^ 4: ReDim jg$(1 To cnt, 1 To 1)
  17.     k = 1: Call dgZH2("", 0, 1) 'k=122,220
  18.    
  19.     Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(k - 1) = jg
  20.     MsgBox Format(Timer - tms, "0.000s ") & Format([a1].End(4).Row - 1, "#,##0")
  21.    
  22. End Sub
  23. Sub dgZH1(s$, i&, t&)
  24.     Dim j&, l&
  25.     For j = i + 1 To m1 - n1 + t
  26.         If t = n1 Then
  27.             k = k + 1
  28.             For l = 1 To n1 - 1
  29.                 sj(k, l) = Mid(s, l, 1)
  30.             Next
  31.             sj(k, n1) = j
  32.             sj2(k) = s & j
  33.         Else
  34.             Call dgZH1(s & j, j, t + 1)
  35.         End If
  36.     Next
  37. End Sub
  38. Sub dgZH2(s$, i&, t&)
  39.     Dim j&, l&
  40. '    cnt2 = cnt2 + 1 '1,474,590
  41.    
  42.     For j = i + 1 To m2 - n2 + t
  43.         For l = 1 To n1
  44.             If jc(sj(j, l)) = c Then Exit For
  45.         Next
  46.         
  47.         If l = n1 + 1 Then
  48.             If t = n2 Then
  49.                 jg(k, 1) = Mid(s, 2) & " " & sj2(j)
  50.                 If k = cnt Then
  51.                     Cells(Cells.Rows.Count, 1).End(3).Offset(1).Resize(cnt) = jg
  52.                     Application.StatusBar = Format([a1].End(4).Row - 1, "#,##0") & Format(Timer - tms, " 0.000s ") & s & sj2(j)
  53.                     k = 1
  54.                 Else
  55.                     k = k + 1
  56.                 End If
  57.             Else
  58.                 For l = 1 To n1
  59.                     jc(sj(j, l)) = jc(sj(j, l)) + 1
  60.                 Next
  61.             
  62.                 Call dgZH2(s & " " & sj2(j), j, t + 1)
  63.                
  64.                 For l = 1 To n1
  65.                     jc(sj(j, l)) = jc(sj(j, l)) - 1
  66.                 Next
  67.             End If
  68.         End If
  69.     Next
  70. End Sub
复制代码
六码组合kagawa.rar (19.24 KB, 下载次数: 23)
回复

使用道具 举报

发表于 2014-2-15 19:04 | 显示全部楼层
dsmch 发表于 2014-2-15 06:48
代码运行速度很慢,要几分钟,请高手优化
6组结果:
012 013 234 456 578 678

你这个代码在组合上没有问题,但检查效率太低……直接就是死机的节奏啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 11:51 , Processed in 0.301851 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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