[Hỏi] Cách liệt kê tất cả tổ hợp chập k của n phần tử

Liên hệ QC
Liệt kê gần 500.000.000 giá trị rồi làm gì tiếp?
thì mỗi ngày Tớ sẽ cố gắng nhập các giá trị ấy, khi nào nó báo được thì dừng. Có gì giúp mình với vì trong ví có hơn 500$, lấy được thì tốt.
Cảm ơn bạn trước
Bài đã được tự động gộp:

Máy tính có RAM trống cỡ 20GB may ra chạy được. @@
Vậy à, cảm ơn bạn nhé
 
thì mỗi ngày Tớ sẽ cố gắng nhập các giá trị ấy, khi nào nó báo được thì dừng. Có gì giúp mình với vì trong ví có hơn 500$, lấy được thì tốt.
Cái ví đó có giới hạn số lần nhập sai liên tiếp không bạn?

Nếu không giới hạn thì mình có thể viết một ứng dụng nhỏ để nó tự động điền.
 
mỗi ngày Tớ sẽ cố gắng nhập các giá trị ấy, khi nào nó báo được thì dừng.
Giả sử mỗi password bạn nhập 2 giây (chắc hơn), giả sử bạn nhập được một nửa chỗ đó là tìm đúng (hên thôi chứ xui có khi phải nhập hết :D ) => Lúc đó bạn cần tới 500.000.000 giây để nhập hết
= 500.000.000/3600/24/365 = 15.85 năm mới tìm được, à quên, điều kiện là cỗ máy bằng cơm này chạy 24/24
 
Giả sử mỗi password bạn nhập 2 giây (chắc hơn), giả sử bạn nhập được một nửa chỗ đó là tìm đúng (hên thôi chứ xui có khi phải nhập hết :D ) => Lúc đó bạn cần tới 500.000.000 giây để nhập hết
= 500.000.000/3600/24/365 = 15.85 năm mới tìm được, à quên, điều kiện là cỗ máy bằng cơm này chạy 24/24
Con nít cũng biết người ta làm bộ để dụ.
Chứ làm gì có chuyện "mỗi ngày sẽ cố gắng nhập". Người siêng mức độ này không thể nào không biết làm toán.
 
thì mỗi ngày Tớ sẽ cố gắng nhập các giá trị ấy, khi nào nó báo được thì dừng. Có gì giúp mình với vì trong ví có hơn 500$, lấy được thì tốt.
Cảm ơn bạn trước
Bài đã được tự động gộp:


Vậy à, cảm ơn bạn nhé
Liệt kê gần 500.000.000 giá trị là hạ sách, cách xử lý của bạn @befaint tối ưu nhất
 
Con nít cũng biết người ta làm bộ để dụ.
Chứ làm gì có chuyện "mỗi ngày sẽ cố gắng nhập". Người siêng mức độ này không thể nào không biết làm toán.
Liệt kê gần 500.000.000 giá trị là hạ sách, cách xử lý của bạn @befaint tối ưu nhất
Mình cũng biết như vậy, tuy nhiên mình sẽ loại trừ, lấy data thỏa mãn kí hiệu đầu tiên và thứ 2 là đúng thì sẽ giảm đi được 10 phần rồi bạn. Nếu được bạn giúp mình nhé
 
Nhập tên vận động viên vào sheet "Ten", chạy sub XYZ xếp lịch thi đấu "sheet1"
Mã:
Option Explicit
  Dim a, S, sTran&, sVong&, sD&
  Dim n&, i&, r&, k&, j&, j2&, c&, t&, z&, iKey$, iKey2$
 
Sub XYZ()
  Dim sArr(), res(), dic As Object, sDoi&
 
  Randomize
  Set dic = CreateObject("scripting.dictionary")
  With Sheets("Ten")
    sArr = .Range("B4", .Range("B" & Rows.Count).End(xlUp)).Value
  End With
  sDoi = UBound(sArr)
  Call XepLich(res, sArr, dic, sDoi)
 
  n = UBound(res)
  For j = 1 To sVong 'Gan ten cac doi
    For i = 1 To sTran
      S = Split(res(i, j), "_")
      res(i, j) = sArr(CLng(S(0)), 1) & "_" & sArr(CLng(S(1)), 1)
    Next i
    If n > sTran Then res(n, j) = sArr(res(n, j), 1)
  Next j
  Sheets("Sheet1").Range("B4:X100").ClearContents
  Sheets("Sheet1").Range("B4").Resize(n, sVong) = res
End Sub

Private Sub XepLich(res, sArr, dic, sDoi)
  Dim bDoiLe As Boolean
 
  bDoiLe = ((sDoi Mod 2) = 1)
  If bDoiLe Then sVong = sDoi Else sVong = sDoi - 1  'So vong dau
  sTran = sDoi \ 2 'So Tran 1 vong
  sD = sTran * 2 'so Doi 1 vong
TuDau:
  If bDoiLe = True Then
    ReDim res(1 To sTran + 1, 1 To sVong)
    a = UniqueRand(sVong)
    For n = 1 To sVong
      res(sTran + 1, n) = a(n)
    Next n
  Else
    ReDim res(1 To sTran, 1 To sVong)
  End If
  For n = 1 To sVong
TroLai:
    If bDoiLe = True Then
      a = CreateUniqueRand(sDoi, res(sTran + 1, n))
    Else
      a = UniqueRand(sD)
    End If
    k = 0: i = 0
    Do While k < sTran
      i = i + 1
      If a(i) <> Empty Then
        k = k + 1
        res(k, n) = a(i)
        a(i) = Empty
        For j = i + 1 To sD '***
          If a(j) <> Empty Then
            iKey = KeyValue(res(k, n), a(j))
            If dic.exists(iKey) = False Then
              dic.Add iKey, ""
              res(k, n) = iKey
              a(j) = Empty
              Exit For
            End If
          End If
        Next j
        If j = sD + 1 Then '***
          For r = 1 To k - 1
            S = Split(res(r, n), "_")
            For c = 0 To 1
              iKey = KeyValue(res(k, n), S(c))
              If dic.exists(iKey) = False Then
                If c = 0 Then t = S(1) Else t = S(0)
                For j2 = i + 1 To sD '***
                  If a(j2) <> Empty Then
                    iKey2 = KeyValue(t, a(j2))
                    If dic.exists(iKey2) = False Then
                      dic.Remove (res(r, n))
                      res(r, n) = iKey2:       res(k, n) = iKey
                      dic.Add iKey, "":       dic.Add iKey2, ""
                      a(j2) = Empty
                      GoTo Thoat
                    End If
                  End If
                Next j2
              End If
            Next c
          Next r
          If r = k Then '****
            z = z + 1
            If z = 50 Then dic.RemoveAll:       z = 0:   GoTo TuDau
            Call RemoveDic(res, dic)
            GoTo TroLai
          End If
        End If
      End If
Thoat:
    Loop
  Next n
End Sub

Private Sub RemoveDic(ByRef res, ByRef dic)
  For r = 1 To k - 1
    dic.Remove (res(r, n))
  Next r
End Sub

Private Function KeyValue(ByVal val_1, ByVal val_2) As String
  If CLng(val_1) < CLng(val_2) Then
    KeyValue = val_1 & "_" & val_2
  Else
    KeyValue = val_2 & "_" & val_1
  End If
End Function

Private Function CreateUniqueRand(ByVal n As Long, ByVal notNum) As Variant
  Dim arr, res, i&, k&
  arr = UniqueRand(n)
  ReDim res(1 To n - 1)
  For i = 1 To n
    If arr(i) <> notNum Then
      k = k + 1
      res(k) = arr(i)
    End If
  Next i
  CreateUniqueRand = res
End Function

Private Function UniqueRand(ByVal n As Long) As Variant
  Dim arr() As Long, i&, RndNum&, tmp&
  ReDim arr(1 To n)
  'Randomize
  For i = 1 To n
    RndNum = Int(n * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(n) = 0 Then arr(RndNum) = n Else arr(RndNum) = arr(n)
    arr(n) = tmp
    n = n - 1
  Next i
  UniqueRand = arr
End Function
Dùng thuật toán mới code gọn và nhanh hơn nhiều
Mã:
Option Explicit
Sub LichThiDauVongTron()
  Dim sArr(), a&(), aNN, res$()
  Dim sDoi&, N&, sR&, i&, j&, k&
 
  With Sheets("Ten")
    sArr = .Range("B4", .Range("B" & Rows.Count).End(xlUp)).Value
  End With
  sDoi = UBound(sArr)
  If sDoi Mod 2 = 1 Then N = sDoi Else N = sDoi - 1
  ReDim a(1 To N, 1 To N)
  For j = 1 To N
    k = j - 1
    For i = 1 To N
      If k = N Then k = 1 Else k = k + 1
      a(i, j) = k
    Next i
  Next j

  sR = sDoi \ 2
  ReDim res(1 To sR, 1 To N)
  Randomize
  For j = 1 To N
    aNN = UniqueRand(sR)
    For i = 1 To sR - sDoi + N
      res(aNN(i), j) = sArr(a(i, j), 1) & "_" & sArr(a(N - i, j), 1)
    Next i
    If sDoi > N Then res(aNN(sR), j) = sArr(a(N, j), 1) & "_" & sArr(sDoi, 1)
  Next j
  Sheets("Sheet1").Range("B3").CurrentRegion.Offset(1).ClearContents
  Sheets("Sheet1").Range("B4").Resize(sR, N) = res
End Sub

Private Function UniqueRand(ByVal N As Long) As Variant
  Dim arr() As Long, i&, RndNum&, tmp&
  ReDim arr(1 To N)
  'Randomize
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If arr(RndNum) = 0 Then tmp = RndNum Else tmp = arr(RndNum)
    If arr(N) = 0 Then arr(RndNum) = N Else arr(RndNum) = arr(N)
    arr(N) = tmp
    N = N - 1
  Next i
  UniqueRand = arr
End Function
 

File đính kèm

  • Liệt kê tổ hợp n chập k=2.xlsm
    31.4 KB · Đọc: 41
Chào các bạn. Mình muốn liệt kê tổ hợp chập 6 của 45. Có nghĩa là liệt kê ra 81 triệu bộ số trong giải Mega Vietlott 6/45. Nhóm mình có ai liệt kê được không cho mình xin file với ạ. Trân thành cảm ơn !
 
Chào các bạn. Mình muốn liệt kê tổ hợp chập 6 của 45. Có nghĩa là liệt kê ra 81 triệu bộ số trong giải Mega Vietlott 6/45. Nhóm mình có ai liệt kê được không cho mình xin file với ạ. Trân thành cảm ơn !
Những người tính để trúng được không còn ở diễn đàn này nữa bạn.
 
Những người tính để trúng được không còn ở diễn đàn này nữa bạn.
Ở thế giới bên kia?

Từ thời thượng cổ tới nay chưa ai tính được số trúng, chỉ có tin đồn không kiểm chứng tung hỏa mù
Giả sử, nếu tôi tính được số trúng thì chuyện gì xảy ra?
Tôi ngu gì khoe ra. Lý do:
1. người nào học lóm được sẽ chia phần với tôi. Làm sao ẵm trọn được.
2. bọn xã hội đen sẽ bắt cóc tôi về, bắt tôi tính số cho chúng đánh.

Suy ra, những người nói rằng mình tính được chắc chắn là nói dóc.
 
Ở những bãi biển tuyệt đẹp ở cõi tiên, nơi vừa nhâm nhi thạch dừa vừa ngắm gái trẻ tắm nắng mặc áo ngực quần dây hoặc chả mặc gì, vừa tính chuyện tiêu bớt tiền ... Có một điều chắc chắn là nếu họ tính được số trúng thì họ chẳng còn ngồi đây làm gì. Có tiền thì bay đi Hawaii luôn chứ điên đâu mà ngồi trên cái gọi là GPE.
 
Hình như nhân viên của họ tính được số trúng mà nhỉ
 
copy đoạn code dưới đây
Mở file mới
Nhấn Alt + F11
Nhấn Alt + I + M
Nhấn Ctrl + V
Nhấn Alt + Q
Nhấn Alt + F8

Vụ chập này có vẻ hay đấy%#^#$

Mã:
Public Sub Tunga2k41()
Dim i, j, k, x, z, res(1 To 210, 1 To 1)
Dim th(3)
For i = 1 To 6
    th(0) = i
    For j = i + 1 To 7
        th(1) = j
        For k = j + 1 To 8
            th(2) = k
            For x = k + 1 To 9
                th(3) = x
                z = z + 1
                res(z, 1) = Join(th)
            Next x
        Next k
    Next j
Next i
With Sheet1
.UsedRange.ClearContents
.Range("A3").Resize(UBound(res), UBound(res, 2)) = res
.UsedRange.Columns.AutoFit
End With
End Sub
Nếu tổ hợp chập 9 của 9 phần từ từ 1 đến 9 thì sửa code như thế nào ạ
 
copy đoạn code dưới đây
Mở file mới
Nhấn Alt + F11
Nhấn Alt + I + M
Nhấn Ctrl + V
Nhấn Alt + Q
Nhấn Alt + F8

Vụ chập này có vẻ hay đấy%#^#$

Mã:
Public Sub Tunga2k41()
Dim i, j, k, x, z, res(1 To 210, 1 To 1)
Dim th(3)
For i = 1 To 6
    th(0) = i
    For j = i + 1 To 7
        th(1) = j
        For k = j + 1 To 8
            th(2) = k
            For x = k + 1 To 9
                th(3) = x
                z = z + 1
                res(z, 1) = Join(th)
            Next x
        Next k
    Next j
Next i
With Sheet1
.UsedRange.ClearContents
.Range("A3").Resize(UBound(res), UBound(res, 2)) = res
.UsedRange.Columns.AutoFit
End With
End Sub
Bài toán này chỉ là 1 trường hợp. Nếu n trường hợp (n<13) thì sao?
Có cách nào tổng quát không hả bạn.
 
Web KT
Back
Top Bottom