Lọc giá trị dựa vào 3 điều kiện (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

khoavu87

Vũ Trần Khoa
Tham gia
5/3/09
Bài viết
1,311
Được thích
1,769
Nghề nghiệp
Kỹ Sư Xây dựng cầu đường
Em có bài toán này mà chưa nghĩ ra thuật toán để giải quyết, Mong các Anh Chị giúp.
 
Lần chỉnh sửa cuối:
Cụm số có màu nền vàng thì có vẻ hiểu (3 fần tử có tổng = 6);

Còn cụm kia: Nhờ tác giả giải thích thêm.
 
Upvote 0
Cụm số có màu nền vàng thì có vẻ hiểu (3 fần tử có tổng = 6);

Còn cụm kia: Nhờ tác giả giải thích thêm.
Cháu nhập vào nhầm mất. Số 2 ở ô cuối cùng cột thông số thay bằng số 3 thì màu đỏ cũng có tổng bằng 6 ạ.
 
Upvote 0
Đã gọi là "LỌC" thì làm sao có trường hợp số phần tử đầu ra của phép lọc lại "NHIỀU HƠN" số phần tử đầu vào??? Bạn có thể mô tả lại được không???
(Có thể bài toán này là: lọc ra dãy số thỏa mãn điều kiện n (=3) số liên tiếp (bất kỳ) có tổng bằng k (=6) chăng?)
 
Upvote 0
Đã gọi là "LỌC" thì làm sao có trường hợp số phần tử đầu ra của phép lọc lại "NHIỀU HƠN" số phần tử đầu vào??? Bạn có thể mô tả lại được không???
(Có thể bài toán này là: lọc ra dãy số thỏa mãn điều kiện n (=3) số liên tiếp (bất kỳ) có tổng bằng k (=6) chăng?)
Tức là trong cột thông số chọn 3 số ( 3 là số nhập vào cột Số phần tử) bất kỳ sao cho nó có tổng bằng 6.
- như vậy trong file đính kèm có 2 dãy ( 3 phần tử) có tổng bằng 6.
+ dãy thứ nhất màu vàng.
+ dãy thứ hai màu đỏ.
 
Upvote 0
Em có bài toán này mà chưa nghĩ ra thuật toán để giải quyết, Mong các Anh Chị giúp.
Chỉ có 3 giá trị thì chẳng có gì để bàn.. Nếu mà tìm vài chục giá trị, tôi nghĩ viết code thông qua vòng lập chắc cũng phải "đói" luôn
E rằng chỉ có Solver mới giải quyết nỗi
Cũng là nghĩ vậy thôi chứ ngay cả dùng Solver tôi cũng chưa nghĩ ra cách thiết lập các ràng buộc thế nào
Bài này có vẻ giống cái này:
http://www.giaiphapexcel.com/forum/showthread.php?6883-Câu-đố-tháng-12-2007-chủ-đề-Solver-(QHTT)
Nhưng xem ra nó khó hơn
 
Upvote 0
Chỉ có 3 giá trị thì chẳng có gì để bàn.. Nếu mà tìm vài chục giá trị, tôi nghĩ viết code thông qua vòng lập chắc cũng phải "đói" luôn
E rằng chỉ có Solver mới giải quyết nỗi
Cũng là nghĩ vậy thôi chứ ngay cả dùng Solver tôi cũng chưa nghĩ ra cách thiết lập các ràng buộc thế nào
Bài này có vẻ giống cái này:
http://www.giaiphapexcel.com/forum/showthread.php?6883-Câu-đố-tháng-12-2007-chủ-đề-Solver-(QHTT)
Nhưng xem ra nó khó hơn
File này em cũng tham khảo rồi, nhưng với số phần tử nhập vào nó chạy từ 0 -->10 thì e rằng hơi khó.
Anh Ndu và các Anh nghĩ xem còn cách nào giải quyết không ạ? Vòng for thì chắc cũng tèo.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài toán này vẫn chưa có cách giải thuật. Mong các Anh giúp.
 
Upvote 0
Chỉ có 3 giá trị thì chẳng có gì để bàn.. Nếu mà tìm vài chục giá trị, tôi nghĩ viết code thông qua vòng lập chắc cũng phải "đói" luôn
E rằng chỉ có Solver mới giải quyết nỗi

VBA giải quyết tốt, bài toán này người ta giải rồi, có thể khác chút

File này em cũng tham khảo rồi, nhưng với số phần tử nhập vào nó chạy từ 0 -->10 thì e rằng hơi khó.
Anh Ndu và các Anh nghĩ xem còn cách nào giải quyết không ạ? Vòng for thì chắc cũng tèo.
Bài này của bạn không phải lọc rồi, xem lại cách đặt vấn đề thì mới tìm hướng giải được, bạn nói rõ lại và cho số liệu nhiều hơn mới rõ,

(Đội tuyển Anh bị gỡ hòa rồi, lại thức thêm đây)
 
Upvote 0
VBA giải quyết tốt, bài toán này người ta giải rồi, có thể khác chút


Bài này của bạn không phải lọc rồi, xem lại cách đặt vấn đề thì mới tìm hướng giải được, bạn nói rõ lại và cho số liệu nhiều hơn mới rõ,

(Đội tuyển Anh bị gỡ hòa rồi, lại thức thêm đây)
Rõ ràng là em gửi vào mục lập trình mà Anh?
bài toán này ở cột nhập dữ liệu là tổng quát. em nhập ở đó mới là ví dụ và khi số phần tử nhập vào là 3 và tổng là 6 thì lọc đc 2 vùng 3 phần tử có tổng là 6 như ví dụ. Rất mong mọi người giúp.
A có thể đưa ví dụ một bài nào đó A bảo người ta giải rồi em tham khảo được không ạ?
 
Upvote 0
Rõ ràng là em gửi vào mục lập trình mà Anh?
bài toán này ở cột nhập dữ liệu là tổng quát. em nhập ở đó mới là ví dụ và khi số phần tử nhập vào là 3 và tổng là 6 thì lọc đc 2 vùng 3 phần tử có tổng là 6 như ví dụ. Rất mong mọi người giúp.
A có thể đưa ví dụ một bài nào đó A bảo người ta giải rồi em tham khảo được không ạ?

vậy dãy số kết quả có thể trùng nhau một số ah, ý là: 1 số trong dãy nguồn (số liệu) cơ thể dùng lại nhiều lần cho các dãy kết quả khác nhau???

và như thế bài này không phải lọc mà là tìm các nhóm số thỏa mãn điều kiện (lọc phải hiểu là loại bỏ bởt đi)?
 
Upvote 0
vậy dãy số kết quả có thể trùng nhau một số ah, ý là: 1 số trong dãy nguồn (số liệu) cơ thể dùng lại nhiều lần cho các dãy kết quả khác nhau???

và như thế bài này không phải lọc mà là tìm các nhóm số thỏa mãn điều kiện (lọc phải hiểu là loại bỏ bởt đi)?
Anh có hướng giải quyết vấn đề này không ạ?
 
Upvote 0
Anh có hướng giải quyết vấn đề này không ạ?

sao bạn không trả lời câu hỏi trên nhỉ???
Nếu đúng theo tôi hiểu thì đây là bài toán tổ hợp nếu lập trình thì có cách là dùng thuật toán đệ quy

bạn tìm hiểu xem sao, tôi cũng đang tìm giải pháp đây
 
Upvote 0
đệ quy - sinh tổ hợp chập k của n phần tử

Đầu óc dạo này kém quá, không còn như xưa nữa rồi. Mãi mới nhớ thuật toán đệ quy sinh tổ hợp.
Trong file đính kèm, ở sheet1 có name: vdulieu, nút để gọi macro và vùng để ghi kết quả.
Là thuật toán đệ quy cho nên có thể hạn chế về mặt dữ liệu, chưa test với dữ liệu nhiều (không dám nói là lớn).
Chương trình gồm 3 thủ tục:
1. Thủ tục đệ quy:
PHP:
Private Sub Try(ByVal i As Long)
Dim j As Long
    For j = ar(i - 1) + 1 To iR - nb + i
        ar(i) = j
        If i = nb Then
            Call printA
        Else
            Call Try(i + 1)
        End If
    Next
End Sub
2. Thủ tục kiểm tra điều kiện
PHP:
Private Sub printA()
Dim x As Long, s As Long
    For x = 1 To nb
        s = s + aDL(ar(x), 1)
    Next
    If s = sm Then
        iC = iC + 1
        For x = 1 To nb
            Sheet1.Cells(iC, 10 + x) = aDL(ar(x), 1)
        Next
    End If
End Sub
3. và cuối cùng là macro để bắt đầu:
PHP:
Sub Main()
Dim ra As Range
    nb = 3
    sm = 6
    Set ra = Sheet1.Range("vdulieu").Resize(, 1)
    nb = ra(1, 2)
    sm = ra(1, 3)
    Set kq = Sheet1.Range("K1")
    kq.Offset(1).Resize(1000, 10).ClearContents
    iR = ra.Rows.Count
    iC = 0
    ReDim aDL(1 To iR, 1 To 1)
    aDL = ra
    ReDim ar(0 To nb)
    ar(0) = 0
    Call Try(1)
    Set ra = Nothing
    Set kq = Nothing
End Sub
4. một số biến khai toàn cục để đơn giản quá trình và được truy xuất từ các sub:
PHP:
Dim nb As Long, sm As Long, ar(), kq As Range, aDL()
Dim iR As Long, iC As Long


Xem cụ thể trong file.
 

File đính kèm

Upvote 0
Đầu óc dạo này kém quá, không còn như xưa nữa rồi. Mãi mới nhớ thuật toán đệ quy sinh tổ hợp.
Trong file đính kèm, ở sheet1 có name: vdulieu, nút để gọi macro và vùng để ghi kết quả.
Là thuật toán đệ quy cho nên có thể hạn chế về mặt dữ liệu, chưa test với dữ liệu nhiều (không dám nói là lớn).

Chuẩn về cách tiếp cần rồi, nhưng có vẻ hơi dài...?

Chưa xem kỹ, nhưng hình như chưa tính tổng?
 
Upvote 0
thêm 1 cách khác

Hôm trước thảo luận với người bạn về bài này (bạn ấy đam mê VB, Excel ), làm thử hoài không được, cuối cùng bạn ấy giúp luôn. Cám ơn người bạn nhé, tôi chép nguyên ý email ra đây, đăng lên mọi người góp ý để cùng học tập, tôi đọc thấy khó hiểu khó hiểu

Đây là một cách cũng dùng đệ quy, nhưng kết hợp tính tổng trong từng bước lặp đệ quy luôn.
PHP:
Sub ToHopDK()
    Dim nk As Long, nN As Long, S As Double, sArr(), akQ
    Dim j As Long, jA As Long
    
    With Sheet1
        nk = .[d6].Value
        S = .[e6].Value
        sArr = .Range(.[C6], .[C6].End(xlDown)).Value
        .Range(.[G6], .[G65536].End(xlUp)).Offset(1).ClearContents
    End With
    nN = UBound(sArr)
    If nk > nN Then GoTo 1
    ReDim akQ(1 To nk, 1 To 1) As Double
    jA = 0
    Call Tim(sArr, nN, nk, S, akQ, jA, 0, 1, 1)
1:  If jA = 0 Then MsgBox "khong co phuong an nao"
End Sub
'''--------------------------------------------------------------------------------------------------------------
Private Sub Tim(a, n As Long, nk As Long, S As Double, akQ, jkQ As Long, vSum As Double, j0 As Long, i As Long)
    Dim j As Long
    If i > nk Then
        If vSum = S Then
            jkQ = jkQ + 1
            Sheet1.[G6].Offset((jkQ - 1) * (nk + 1)).Resize(nk) = akQ
        End If
    Else
        For j = j0 To n
            akQ(i, 1) = a(j, 1)
            vSum = vSum + akQ(i, 1)
            Call Tim(a, n, nk, S, akQ, jkQ, vSum, j + 1, i + 1)
            vSum = vSum - akQ(i, 1)
        Next j
    End If
End Sub

Kết quả đặt tại cột G , các nhóm số cách nhau 1 ô trống

Dạng bài toán này sẽ ngốn bộ nhớ rất nhiều khi số phần tử nhiều lên và số phần tử chọn cho 1 nhóm lại rất nhỏ so với tổng số phần tử - nên người dùng cần chú ý.


Không do ứng dụng vào việc gì??? khoavu87?

Và nói thêm: đây không phải là bài toán lọc 3 điều kiện như tiêu đề topic - nên từ đầu tôi nói là bạn phải đặt lại vấn đề là vậy
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 Anh, em sẽ nghiên cứu hai phương án này. Về các tiếp cận bài toán đã được giải quyết. Em cũng ngoại đạo về lập trình nên chưa biết nhiều bài toán đệ quy, 2 Anh có những loại bài toán kiểu này gửi lên Anh em tham khảo với ạ. Chân thành cảm ơn.
 
Upvote 0
Mấy hôm nghiên cứu Code từ hai bài trên nhưng vẫn chưa hiểu code lắm, khi thêm một điều kiện thì Em làm mãi chưa được. Mong lại được trợ giúp từ các Anh. Chi tiết như file đính kèm
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom