Tìm nhóm số với số cột lớn nhất

Liên hệ QC

Sơn Mã

Thành viên hoạt động
Tham gia
30/12/16
Bài viết
114
Được thích
2
Mình có một nan đề sau làm rất lâu rồi mà chưa có phương án giải quyết: dữ liệu ở sheet(DULIEU) gồm có 100 cột: số liệu trong các cột là những số trong khoảng từ 00 đến 99. Mình cần chọn ra 5 nhóm số càng nhiều số càng tốt như sau:
Yêu cầu: với mỗi một nhóm số:
1/ Trong mỗi cột chỉ được chọn 1 số.
2/ Bắt đầu Chọn từ cột 1 đầu tiên rồi lần lượt chọn đến các cột tiếp theo (không được chọn nhảy bỏ qua cột).
3/ Các số được chọn trong các cột không được trùng lặp lại. (Ví dụ cột 1 chọn số 03 thì các cột tiếp theo không được chọn số 03 nữa)
4/ Tìm phương án chọn sao cho số cột được chọn là nhiều nhất: từ cột 1 đến cột n (Với n là lớn nhất có thể (n=< 100)).
5/ Chọn ra 5 phương án để có 5 nhóm số với số cột là lớn nhất có thể.
6/ Kết quả chọn: dán sang sheet(KETQUA) và dán vào dòng 2 ( nhóm số cột lớn nhất), dòng 3 (nhóm số cột lớn thứ 2), dòng 4 (nhóm số cột lớn thứ 3), dòng 5 (nhóm số cột lớn thứ 4), dòng 6 (nhóm số cột lớn thứ 5) vào số cột tương ứng.
Mong các bạn và GPE giúp đỡ. Xin trân trọng cảm ơn!
 

File đính kèm

  • timnhomso_khongtrunglap.xlsx
    63.1 KB · Đọc: 33
Mình có một nan đề sau làm rất lâu rồi mà chưa có phương án giải quyết: dữ liệu ở sheet(DULIEU) gồm có 100 cột: số liệu trong các cột là những số trong khoảng từ 00 đến 99. Mình cần chọn ra 5 nhóm số càng nhiều số càng tốt như sau:
Yêu cầu: với mỗi một nhóm số:
1/ Trong mỗi cột chỉ được chọn 1 số.
2/ Bắt đầu Chọn từ cột 1 đầu tiên rồi lần lượt chọn đến các cột tiếp theo (không được chọn nhảy bỏ qua cột).
3/ Các số được chọn trong các cột không được trùng lặp lại. (Ví dụ cột 1 chọn số 03 thì các cột tiếp theo không được chọn số 03 nữa)
4/ Tìm phương án chọn sao cho số cột được chọn là nhiều nhất: từ cột 1 đến cột n (Với n là lớn nhất có thể (n=< 100)).
5/ Chọn ra 5 phương án để có 5 nhóm số với số cột là lớn nhất có thể.
6/ Kết quả chọn: dán sang sheet(KETQUA) và dán vào dòng 2 ( nhóm số cột lớn nhất), dòng 3 (nhóm số cột lớn thứ 2), dòng 4 (nhóm số cột lớn thứ 3), dòng 5 (nhóm số cột lớn thứ 4), dòng 6 (nhóm số cột lớn thứ 5) vào số cột tương ứng.
Mong các bạn và GPE giúp đỡ. Xin trân trọng cảm ơn!
Có bạn nào xem giúp đỡ mình với ạ? Có chỗ nào không rõ mình xin trình bày lại. Xin cảm ơn rất nhiều!
 
1/ Trong mỗi cột chỉ được chọn 1 số.
2/ Bắt đầu Chọn từ cột 1 đầu tiên rồi lần lượt chọn đến các cột tiếp theo (không được chọn nhảy bỏ qua cột).
3/ Các số được chọn trong các cột không được trùng lặp lại. (Ví dụ cột 1 chọn số 03 thì các cột tiếp theo không được chọn số 03 nữa)
4/ Tìm phương án chọn sao cho số cột được chọn là nhiều nhất: từ cột 1 đến cột n (Với n là lớn nhất có thể (n=< 100)).
5/ Chọn ra 5 phương án để có 5 nhóm số với số cột là lớn nhất có thể.
6/ Kết quả chọn: dán sang sheet(KETQUA) và dán vào dòng 2 ( nhóm số cột lớn nhất), dòng 3 (nhóm số cột lớn thứ 2), dòng 4 (nhóm số cột lớn thứ 3), dòng 5 (nhóm số cột lớn thứ 4), dòng 6 (nhóm số cột lớn thứ 5) vào số cột tương ứng.
Theo 3; 4; 5 + suy luận thì thấy: với 1 nhóm, số cột được chọn nhiều nhất là = 5
 
Theo 3; 4; 5 + suy luận thì thấy: với 1 nhóm, số cột được chọn nhiều nhất là = 5
Cảm ơn bạn đã quan tâm!
Mình xin lấy ví dụ 1 trường hợp chọn ngẫu nhiên: cột 1: 03; cột 2: 10; cột 3: 13; cột 4: 11; cột 5: 14; cột 6: 04; ..v.v.v như vậy số cột ở đây đã lớn hơn 5 và các số được chọn không bị trùng lặp.
 
Mình có một nan đề sau làm rất lâu rồi mà chưa có phương án giải quyết: dữ liệu ở sheet(DULIEU) gồm có 100 cột: số liệu trong các cột là những số trong khoảng từ 00 đến 99. Mình cần chọn ra 5 nhóm số càng nhiều số càng tốt như sau:
Yêu cầu: với mỗi một nhóm số:
1/ Trong mỗi cột chỉ được chọn 1 số.
2/ Bắt đầu Chọn từ cột 1 đầu tiên rồi lần lượt chọn đến các cột tiếp theo (không được chọn nhảy bỏ qua cột).
3/ Các số được chọn trong các cột không được trùng lặp lại. (Ví dụ cột 1 chọn số 03 thì các cột tiếp theo không được chọn số 03 nữa)
4/ Tìm phương án chọn sao cho số cột được chọn là nhiều nhất: từ cột 1 đến cột n (Với n là lớn nhất có thể (n=< 100)).
5/ Chọn ra 5 phương án để có 5 nhóm số với số cột là lớn nhất có thể.
6/ Kết quả chọn: dán sang sheet(KETQUA) và dán vào dòng 2 ( nhóm số cột lớn nhất), dòng 3 (nhóm số cột lớn thứ 2), dòng 4 (nhóm số cột lớn thứ 3), dòng 5 (nhóm số cột lớn thứ 4), dòng 6 (nhóm số cột lớn thứ 5) vào số cột tương ứng.
Mong các bạn và GPE giúp đỡ. Xin trân trọng cảm ơn!
chép code vào Module
trước khi đi ngũ, chạy code , sáng dậy hi vọng có kết quả
nếu máy yếu thì đừng hi vọng
Mã:
Sub HoanVi()
Dim Arr(), Darr(), Kq(), LT(), i As Integer, S As Integer, j As Integer, C As Integer, k As Integer, dem As Long
S = Sheets("DULIEU").UsedRange.Rows.Count - 1
C = 100
Darr = Sheets("DULIEU").Range("A2", Sheets("DULIEU").Cells(S + 1, C)).Value
ReDim Kq(1 To 5, 1 To C + 1)
ReDim Arr(1 To 4, 1 To C)
For j = 1 To C
    For i = 1 To S
        If Darr(i, j) = "" Then
            Arr(2, j) = i - 1   'so dong cot j
            Exit For
        End If
    Next i
    dk = dk & "z" & Arr(2, j)
Next j
For j = 1 To C
    Arr(1, j) = Darr(1, j):    Arr(3, j) = 1 'thu tu dòng lan truoc, cot j
Next j
i = 2
LT = LoaiTrung(Arr(), C)
Kq = ChonDong(LT, C, Kq, i)
Do
    Arr(4, C) = (Arr(3, C) Mod Arr(2, C)) + 1
    Arr(1, C) = Darr(Arr(4, C), C)
    For j = C - 1 To 1 Step -1
        For k = C To j + 1 Step -1
            If Arr(2, k) <> Arr(3, k) Then
                Arr(4, j) = Arr(3, j)
                GoTo Tiep
            End If
        Next k
        Arr(4, j) = (Arr(3, j) Mod Arr(2, j)) + 1
        Arr(1, j) = Darr(Arr(4, j), j)
Tiep:
    Next j
    For j = 1 To C
        Arr(3, j) = Arr(4, j)
    Next j
    i = i + 1
    If i > 7 Then i = 7
    LT = LoaiTrung(Arr(), C)
    Kq = ChonDong(LT, C, Kq, i)
    tmp = ""
    For j = 1 To C
        tmp = tmp & "z" & Arr(3, j)
    Next j
    dem = dem + 1  '2 dong lenh thoat khoi Sub khi khai báo so vong lap dem
    If dem = 30000 Then GoTo thoat     ' so vong lap gioi han dem = ?
Loop Until tmp = dk
thoat:
Sheets("KETQUA").Range("A2").Resize(5, C + 1) = Kq
End Sub

Function ChonDong(ST(), C As Integer, Kq(), i As Integer)
Dim Sarr(), k As Integer
Sarr = Kq
If i <= 6 Then
    For j = 1 To C + 1
        Sarr(i - 1, j) = ST(1, j)
    Next j
Else
    For k = 1 To 5
        If ST(1, C + 1) > Sarr(k, C + 1) Then
            For j = 1 To C + 1
                Sarr(k, j) = ST(1, j)
            Next j
            Exit For
        End If
    Next k
End If
ChonDong = Sarr
End Function

Function LoaiTrung(Arr(), C As Integer)
Dim Sarr(), Dic As Object, j As Integer
ReDim Sarr(1 To 1, 1 To C + 1)
Set Dic = CreateObject("scripting.dictionary")
For j = 1 To C
    If Not Dic.exists(Arr(1, j)) Then
        Dic.Add Arr(1, j), ""
        Sarr(1, j) = Arr(1, j)
        Sarr(1, C + 1) = Sarr(1, C + 1) + 1
    End If
Next j
Set Dic = Nothing
LoaiTrung = Sarr
End Function
 
Trước khi đi ngũ, chạy code sau, sáng dậy hi vọng có kết quả
nếu máy yếu thì đừng hi vọng
Mã:
Sub HoanVi()
Dim Arr(), Darr(), Kq(), LT(), i As Integer, S As Integer, j As Integer, C As Integer, k As Integer, dem As Long
S = Sheets("DULIEU").UsedRange.Rows.Count - 1
C = 100
Darr = Sheets("DULIEU").Range("A2", Sheets("DULIEU").Cells(S + 1, C)).Value
ReDim Kq(1 To 5, 1 To C + 1)
ReDim Arr(1 To 4, 1 To C)
For j = 1 To C
    For i = 1 To S
        If Darr(i, j) = "" Then
            Arr(2, j) = i - 1   'so dong cot j
            Exit For
        End If
    Next i
    dk = dk & "z" & Arr(2, j)
Next j
For j = 1 To C
    Arr(1, j) = Darr(1, j):    Arr(3, j) = 1 'thu tu dòng lan truoc, cot j
Next j
i = 2
LT = LoaiTrung(Arr(), C)
Kq = ChonDong(LT, C, Kq, i)
Do
    Arr(4, C) = (Arr(3, C) Mod Arr(2, C)) + 1
    Arr(1, C) = Darr(Arr(4, C), C)
    For j = C - 1 To 1 Step -1
        For k = C To j + 1 Step -1
            If Arr(2, k) <> Arr(3, k) Then
                Arr(4, j) = Arr(3, j)
                GoTo Tiep
            End If
        Next k
        Arr(4, j) = (Arr(3, j) Mod Arr(2, j)) + 1
        Arr(1, j) = Darr(Arr(4, j), j)
Tiep:
    Next j
    For j = 1 To C
        Arr(3, j) = Arr(4, j)
    Next j
    i = i + 1
    If i > 7 Then i = 7
    LT = LoaiTrung(Arr(), C)
    Kq = ChonDong(LT, C, Kq, i)
    tmp = ""
    For j = 1 To C
        tmp = tmp & "z" & Arr(3, j)
    Next j
    dem = dem + 1  '2 dong lenh thoat khoi Sub khi khai báo so vong lap dem
    If dem = 30000 Then GoTo thoat     ' so vong lap gioi han dem = ?
Loop Until tmp = dk
thoat:
Sheets("KETQUA").Range("A2").Resize(5, C + 1) = Kq
End Sub
Function ChonDong(ST(), C As Integer, Kq(), i As Integer)
Dim Sarr(), k As Integer
Sarr = Kq
If i <= 6 Then
    For j = 1 To C + 1
        Sarr(i - 1, j) = ST(1, j)
    Next j
Else
    For k = 1 To 5
        If ST(1, C + 1) > Sarr(k, C + 1) Then
            For j = 1 To C + 1
                Sarr(k, j) = ST(1, j)
            Next j
            Exit For
        End If
    Next k
End If
ChonDong = Sarr
End Function
Function LoaiTrung(Arr(), C As Integer)
Dim Sarr(), Dic As Object, j As Integer
ReDim Sarr(1 To 1, 1 To C + 1)
Set Dic = CreateObject("scripting.dictionary")
For j = 1 To C
    If Not Dic.exists(Arr(1, j)) Then
        Dic.Add Arr(1, j), ""
        Sarr(1, j) = Arr(1, j)
        Sarr(1, C + 1) = Sarr(1, C + 1) + 1
    End If
Next j
Set Dic = Nothing
LoaiTrung = Sarr
End Function
Dạ, cảm ơn bạn nhiều quá. Mình chạy luôn xem sao ạ!
 

File đính kèm

  • timnhomso_khongtrunglap.xlsm
    52 KB · Đọc: 8
Sau khi mình chạy khoảng 3 phút thì có kết quả như thế này ạ! Không được như yêu cầu đưa ra, mong bạn xem giúp ạ! Xin cảm ơn rất nhiều!

Vậy thì chạy thử Sub này coi sao, Cột CW là số đếm các ô liên tiếp không trùng, Cột CX ghi số dòng của dữ liệu.
PHP:
Public Sub GPE()
Dim Sarr(), Darr(), tArr(), Tem As String
Dim i As Long, j As Long, k As Long, N As Long, MaxN As Long, C As Long, R As Long, jI As Long
With Sheets("DULIEU")
    Sarr = .Range("A1").CurrentRegion.Value
    R = UBound(Sarr): C = UBound(Sarr, 2)
End With
ReDim Darr(1 To R, 1 To C + 2)
ReDim tArr(1 To R, 1 To 1)
For i = 2 To R
    Tem = "": N = 0: MaxN = 0
    For j = 1 To C
        If InStr(Tem, Sarr(i, j) & "#") = 0 Then
            N = N + 1
            Tem = Tem & Sarr(i, j) & "#"
        Else
            If MaxN < N Then
                MaxN = N
                For jI = j - N - 1 To 1 Step -1
                    Sarr(i, jI) = Empty
                Next jI
            End If
            Tem = "": N = 0
        End If
    Next j
    tArr(i, 1) = MaxN
Next i
With Sheets("KETQUA")
    .Range("CX1").Resize(R) = tArr
    MaxN = Application.WorksheetFunction.Large(Range("CX2").Resize(R), 5)
For i = 2 To R
    If tArr(i, 1) >= MaxN Then
        k = k + 1
        For j = 1 To C
            If Sarr(i, j) <> Empty Then
                For jI = j To j + tArr(i, 1) - 1
                    Darr(k, jI) = Sarr(i, jI)
                Next jI
                Exit For
            End If
        Next j
        Darr(k, C + 1) = tArr(i, 1)
        Darr(k, C + 2) = i
    End If
Next i
    .Range("A2:CX1000").ClearContents
    .Range("A2").Resize(k, C + 2) = Darr
    .Range("A2").Resize(k, C + 2).Sort Key1:=.Range("CW2"), Order1:=xlDescending
End With
End Sub
 

File đính kèm

  • timnhomso_khongtrunglap.rar
    46.2 KB · Đọc: 9
Vậy thì chạy thử Sub này coi sao, Cột CW là số đếm các ô liên tiếp không trùng, Cột CX ghi số dòng của dữ liệu.
PHP:
Public Sub GPE()
Dim Sarr(), Darr(), tArr(), Tem As String
Dim i As Long, j As Long, k As Long, N As Long, MaxN As Long, C As Long, R As Long, jI As Long
With Sheets("DULIEU")
    Sarr = .Range("A1").CurrentRegion.Value
    R = UBound(Sarr): C = UBound(Sarr, 2)
End With
ReDim Darr(1 To R, 1 To C + 2)
ReDim tArr(1 To R, 1 To 1)
For i = 2 To R
    Tem = "": N = 0: MaxN = 0
    For j = 1 To C
        If InStr(Tem, Sarr(i, j) & "#") = 0 Then
            N = N + 1
            Tem = Tem & Sarr(i, j) & "#"
        Else
            If MaxN < N Then
                MaxN = N
                For jI = j - N - 1 To 1 Step -1
                    Sarr(i, jI) = Empty
                Next jI
            End If
            Tem = "": N = 0
        End If
    Next j
    tArr(i, 1) = MaxN
Next i
With Sheets("KETQUA")
    .Range("CX1").Resize(R) = tArr
    MaxN = Application.WorksheetFunction.Large(Range("CX2").Resize(R), 5)
For i = 2 To R
    If tArr(i, 1) >= MaxN Then
        k = k + 1
        For j = 1 To C
            If Sarr(i, j) <> Empty Then
                For jI = j To j + tArr(i, 1) - 1
                    Darr(k, jI) = Sarr(i, jI)
                Next jI
                Exit For
            End If
        Next j
        Darr(k, C + 1) = tArr(i, 1)
        Darr(k, C + 2) = i
    End If
Next i
    .Range("A2:CX1000").ClearContents
    .Range("A2").Resize(k, C + 2) = Darr
    .Range("A2").Resize(k, C + 2).Sort Key1:=.Range("CW2"), Order1:=xlDescending
End With
End Sub
Dạ cảm ơn bạn ạ! Bạn ơi, bạn xem giúp ạ. Yêu cầu không phải là tìm ra số ô liên tiếp lớn nhất trong cùng 1 dòng ạ.
- Yêu cầu ở đây là tìm ra nhóm dữ liệu lớn nhất không trùng lặp: xuất phát từ cột 1 rồi lần lượt các cột tiếp theo, dữ liệu không bắt buộc phải ở trong cùng 1 dòng. (Giống như trò chơi: nối các dữ liệu từ cột 1 lần lượt đến các cột tiếp theo mà đường nối đi qua dữ liệu ở các cột không được trùng lặp)
 
Dạ cảm ơn bạn ạ! Bạn ơi, bạn xem giúp ạ. Yêu cầu không phải là tìm ra số ô liên tiếp lớn nhất trong cùng 1 dòng ạ.
- Yêu cầu ở đây là tìm ra nhóm dữ liệu lớn nhất không trùng lặp: xuất phát từ cột 1 rồi lần lượt các cột tiếp theo, dữ liệu không bắt buộc phải ở trong cùng 1 dòng. (Giống như trò chơi: nối các dữ liệu từ cột 1 lần lượt đến các cột tiếp theo mà đường nối đi qua dữ liệu ở các cột không được trùng lặp)

Chưa hiểu lắm. Chờ mò để hiểu đã.
Kết quả chỉ xét trên cùng 1 dòng không có dữ liệu trùng hay xét trong từng cột cũng không trùng? Hay cả bảng kết quả không có dữ liệu trùng?
 

File đính kèm

  • timnhomso_khongtrunglap.rar
    47.5 KB · Đọc: 8
Lần chỉnh sửa cuối:
Chưa hiểu lắm. Chờ mò để hiểu đã.
Hình như là thề này:
Lựa lấy cột A 1 số, tới cột B 1 số....tới cột thứ 100 (cột nào hổng chọn được thì bỏ qua), tạo thành một nhóm có số số hạng nhiều nhất (nhỏ hơn hoặc bằng 100) và không trùng
Sau đó tìm nhiều thứ 2, 3, 4, 5
Nếu đúng thế thì bài này....khó "thấy bà"
Híc
 
Lần chỉnh sửa cuối:
Hình như là thề này:
Lựa lấy cột A 1 số, tới cột B 1 số....tới cột thứ 100 (cột nào hổng chọn được thì bỏ qua), tạo thành một nhóm có số số hạng nhiều nhất (nhỏ hơn hoặc bằng 100) và không trùng
Sau đó tìm nhiều thứ 2, 3, 4, 5
Nếu đúng thế thì bài này....khó "thấy bà"
Híc
Dạ đúng rồi ạ. Nên đây là một nan đề ạ. Rất mong được sự giúp đỡ của GPE ạ!
 
Chưa hiểu lắm. Chờ mò để hiểu đã.
Kết quả chỉ xét trên cùng 1 dòng không có dữ liệu trùng hay xét trong từng cột cũng không trùng? Hay cả bảng kết quả không có dữ liệu trùng?
Dạ, đúng như bạn làm rồi đó ạ. Mình đang kiểm tra lại ạ! Xin cảm ơn nhiều quá.
Bạn ơi, cho mình hỏi thêm chút ạ. Nếu muốn tăng thêm kết quả, không phải 5 nhóm nữa mà là 10 nhóm thì làm thế nào ạ? Xin cảm ơn rất nhiều!
 
Lần chỉnh sửa cuối:
Sau khi mình chạy khoảng 3 phút thì có kết quả như thế này ạ! Không được như yêu cầu đưa ra, mong bạn xem giúp ạ! Xin cảm ơn rất nhiều!
chỉ chạy 3 phút, làm sao ra được kết quả, chỉ mới duyệt qua 30000 khả năng thôi, còn số khả năng còn lại chưa xét rất lớn, chạy nguyên một đêm mới hi vọng xét hết
 
Thầy Ba Tê chú í: Thầy Cò Già fát biểu sai 1 mệnh đề:

Mình có một nan đề sau làm rất lâu rồi mà chưa có phương án giải quyết: dữ liệu ở sheet(DULIEU) gồm có 100 cột: số liệu trong các cột là những số trong khoảng từ 00 đến 99. Mình cần chọn ra 5 nhóm số càng nhiều số càng tốt như sau:
Yêu cầu: với mỗi một nhóm số:
1/ Trong mỗi cột chỉ được chọn 1 số.
2/ Bắt đầu Chọn từ cột 1 đầu tiên rồi lần lượt chọn đến các cột tiếp theo (không được chọn nhảy bỏ qua cột).
3/ Các số được chọn trong các cột không được trùng lặp lại. (Ví dụ cột 1 chọn số 03 thì các cột tiếp theo không được chọn số 03 nữa)
4/ Tìm phương án chọn sao cho số cột được chọn là nhiều nhất: từ cột 1 đến cột n (Với n là lớn nhất có thể (n=< 100)).
5/ Chọn ra 5 phương án để có 5 nhóm số với số cột là lớn nhất có thể.
6/ Kết quả chọn: dán sang sheet(KETQUA) và dán vào dòng 2 ( nhóm số cột lớn nhất), dòng 3 (nhóm số cột lớn thứ 2), dòng 4 (nhóm số cột lớn thứ 3), dòng 5 (nhóm số cột lớn thứ 4), dòng 6 (nhóm số cột lớn thứ 5) vào số cột tương ứng.

%#^#$ %#^#$ %#^#$ -=.,, -=.,, -=.,, -+*/ -+*/ -+*/
 
chỉ chạy 3 phút, làm sao ra được kết quả, chỉ mới duyệt qua 30000 khả năng thôi, còn số khả năng còn lại chưa xét rất lớn, chạy nguyên một đêm mới hi vọng xét hết
bạn bỏ 2 dòng ghi chú lệnh đếm, để duyệt qua tất cả khả năng
 
Web KT

Bài viết mới nhất

Back
Top Bottom