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 ạ.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.
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.Đã 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?)
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ônEm 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.
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ó.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
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
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õ,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.
Rõ ràng là em gửi vào mục lập trình mà Anh?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 ạ?
Anh có hướng giải quyết vấn đề này 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)?
Anh có hướng giải quyết vấn đề này không ạ?
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
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
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
Dim nb As Long, sm As Long, ar(), kq As Range, aDL()
Dim iR As Long, iC As Long
Đầ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).
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