|
发表于 2014-8-13 20:45
|
显示全部楼层
本楼为最佳答案
本帖最后由 香川群子 于 2014-8-13 20:59 编辑
因为组合4、5、6都有 错误值=0时的解。
还好,几秒钟就能算完。
- Dim a&(), b$(), c&(), AC&, m&, n&, k&, z&, cnt&, tms# '定义公用变量
- Sub kagawa()
- Dim i&, j&
- tms = Timer
-
- ar = [CN146:EH240]
- ReDim a&(1 To 95, 1 To 47)
- For i = 1 To 95
- For j = 1 To 47
- If ar(i, j) = "有" Then a(i, j) = 1 '整理原始数据以便快速检查
- Next
- Next
- ReDim b$(100) '存放结果的数组b初始化
-
- m = 47: n = [EI145]: z = [EJ145]
- AC = WorksheetFunction.Combin(m, n)
- ReDim c&(1 To n)
- k = 0: cnt = 0: Call dgZH("", 0, 1) '调用递归组合算法
- Application.StatusBar = Format(Timer - tms, "0.000s ") & cnt & " / " & Format(k, "#,##0")
-
- If cnt Then [EL145].CurrentRegion = "": [EL145].Resize(cnt) = WorksheetFunction.Transpose(b)
- MsgBox Format(Timer - tms, "0.000s ") & Format(cnt, "#,##0")
- End Sub
- Sub dgZH(s$, i&, t&) '递归组合计算过程
- Dim j&
- For j = i + 1 To m - n + t
- c(t) = j
- If t < n Then
- Call dgZH(s & "," & j, j, t + 1)
- Else
- k = k + 1
- If Chk(n) Then
- b(cnt) = Mid(s & "," & j, 2)
- cnt = cnt + 1: If cnt > UBound(b) Then ReDim Preserve b$(cnt + 100)
- Application.StatusBar = Format(Timer - tms, "0.000s ") & cnt & Format(k / AC, " 0.0% ") & Format((AC / k - 1) * (Timer - tms), " 0.0s")
- End If
- End If
- Next
- End Sub
- Function Chk(t&) As Boolean '检查过程
- Dim i&, j&, r&
- Chk = True: r = z
- For i = 1 To 95
- For j = 1 To n
- If a(i, c(j)) Then Exit For
- Next
- If j > n Then If r Then r = r - 1 Else Chk = False: Exit Function
- Next
- End Function
复制代码
寻找相同列.rar
(26.88 KB, 下载次数: 14)
|
|