Chọn các số trong dãy số để ra 1 số tổng cho trước

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
937
Được thích
571
Chào các anh chị trong diễn đàn.

Tôi có nhu cầu như sau: Tôi có 1 dãy số (gồm nhiều ô, các ô có giá trị bất kỳ). Tôi muốn tìm ra những ô nào trong dãy đó cộng với nhau sẽ ra 1 giá trị cho trước. Mỗi ô chỉ được cộng 1 lần. Không cần tìm hết các phương án thỏa mãn, chỉ cần tìm được 1 đáp án là đạt yêu cầu

Mong mọi người dùng giúp đỡ
 

File đính kèm

  • Book1.xls
    21.5 KB · Đọc: 216
CODE này chạy rất nhanh, nhẹ - thuật giải thật tuyệt vời - Cảm ơn huuthang_bd rất nhiều
Nhưng là Function mới chỉ cho ra 1 đáp án
XIN GIÚP: Giờ muốn chuyển thành Sub để liệt kê hết các đáp án (các hoán vị lệt kê 1 lần) thì sửa code này như nào ?
Bài ở đây dạng liệt kê nè bạn.
 
Upvote 0
Làm thử vầy. Hình như thuật toán này gọi là thuật toán vét cạn.
PHP:
Function SumF(Num As Double, ParamArray Args() As Variant) As String
Dim Data(), Cll As Range, n As Long, k As Long, Arr(), Total As Double
For i = LBound(Args) To UBound(Args)
    For Each Cll In Args(i)
        If Val(Cll.Value) <> 0 Then
            n = n + 1
            ReDim Preserve Data(1 To 2, 1 To n)
            Data(1, n) = Val(Cll.Value)
            Data(2, n) = Cll.Address(0, 0)
        End If
    Next
Next
ReDim Arr(1 To 1)
Arr(1) = 1
Total = Data(1, 1)
n = 1
k = 1
Do While Num <> Total
    If Arr(1) = UBound(Data, 2) Then
        SumF = "#N/A"
        Exit Function
    End If
    If Total > Num Then
        If k = UBound(Data, 2) Then
            k = Arr(n - 1) + 1
            Total = Total - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
            n = n - 1
            Arr(n) = k
        Else
            k = k + 1
            Total = Total - Data(1, Arr(n)) + Data(1, k)
            Arr(n) = k
        End If
    Else
        If k = UBound(Data, 2) Then
            k = Arr(n - 1) + 1
            Total = Total - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
            n = n - 1
            Arr(n) = k
        Else
            k = k + 1
            Total = Total + Data(1, k)
            n = n + 1
            ReDim Preserve Arr(1 To n)
            Arr(n) = k
        End If
    End If
Loop
For k = 1 To n
    SumF = SumF & "+" & Data(2, Arr(k))
Next
SumF = Replace(SumF, "+", "=", 1, 1)
End Function
a oi đoạn code này ap dung số nguyên thì e tìm ra đáp số, nhưng nếu áp dụng những số mà có thập phân thì có cách nào không ạ!!! chỉ giúp e với ạ
 
Upvote 0
a oi đoạn code này ap dung số nguyên thì e tìm ra đáp số, nhưng nếu áp dụng những số mà có thập phân thì có cách nào không ạ!!! chỉ giúp e với ạ
Theo lý thuyết thì cứ làm cho các số thập phân thành số nguyên, được kết quả rồi chuyển ngược lại.
 
Upvote 0
Theo lý thuyết thì cứ làm cho các số thập phân thành số nguyên, được kết quả rồi chuyển ngược lại.
dạ e cũng thử chuyển đổi rồi mà khi E ap dung đoạn mã nó bị treo máy luôn, a xem giúp e file với a, cam ơn a nhieu ạ!
 

File đính kèm

  • luong t2.xlsx
    14.4 KB · Đọc: 8
Upvote 0
Làm thử vầy. Hình như thuật toán này gọi là thuật toán vét cạn.
PHP:
Function SumF(Num As Double, ParamArray Args() As Variant) As String
Dim Data(), Cll As Range, n As Long, k As Long, Arr(), Total As Double
For i = LBound(Args) To UBound(Args)
    For Each Cll In Args(i)
        If Val(Cll.Value) <> 0 Then
            n = n + 1
            ReDim Preserve Data(1 To 2, 1 To n)
            Data(1, n) = Val(Cll.Value)
            Data(2, n) = Cll.Address(0, 0)
        End If
    Next
Next
ReDim Arr(1 To 1)
Arr(1) = 1
Total = Data(1, 1)
n = 1
k = 1
Do While Num <> Total
    If Arr(1) = UBound(Data, 2) Then
        SumF = "#N/A"
        Exit Function
    End If
    If Total > Num Then
        If k = UBound(Data, 2) Then
            k = Arr(n - 1) + 1
            Total = Total - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
            n = n - 1
            Arr(n) = k
        Else
            k = k + 1
            Total = Total - Data(1, Arr(n)) + Data(1, k)
            Arr(n) = k
        End If
    Else
        If k = UBound(Data, 2) Then
            k = Arr(n - 1) + 1
            Total = Total - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
            n = n - 1
            Arr(n) = k
        Else
            k = k + 1
            Total = Total + Data(1, k)
            n = n + 1
            ReDim Preserve Arr(1 To n)
            Arr(n) = k
        End If
    End If
Loop
For k = 1 To n
    SumF = SumF & "+" & Data(2, Arr(k))
Next
SumF = Replace(SumF, "+", "=", 1, 1)
End Function
em có 1 file tương tự như vậy, tìm các giá trị ở cột C tổng lại sao cho chênh lệch bằng với ô D2 cho phép lệch từ 0 đồng đến 200 đồng, tổng các giá trị trên cột C có thể bằng hoặc lớn hơn, nhỏ hơn D2 trong khoảng 200 đồng, và cho ra các kết quả bên cột E, xem có bao nhiêu tổ hợp và hiển thị xem đó là những dòng nào trong cột C tổ hợp lại. Mong bác giúp đỡ em vì em làm số liệu cho công ty nên cũng cần đến nó ạ
 

File đính kèm

  • tim tong.xlsm
    14.8 KB · Đọc: 3
Upvote 0
em có 1 file tương tự như vậy, tìm các giá trị ở cột C tổng lại sao cho chênh lệch bằng với ô D2 cho phép lệch từ 0 đồng đến 200 đồng, tổng các giá trị trên cột C có thể bằng hoặc lớn hơn, nhỏ hơn D2 trong khoảng 200 đồng, và cho ra các kết quả bên cột E, xem có bao nhiêu tổ hợp và hiển thị xem đó là những dòng nào trong cột C tổ hợp lại. Mong bác giúp đỡ em vì em làm số liệu cho công ty nên cũng cần đến nó ạ
Chạy solver trong file đính kèm
 

File đính kèm

  • tim tong.xlsx
    10.6 KB · Đọc: 6
Upvote 0
Chạy solver trong file đính kèm
Chạy solver trong file đính kèm
vâng em cảm ơn bác ạ
Bài đã được tự động gộp:

Chạy solver trong file đính kèm
nhưng file của em ý là nó ko cố định chênh lệch 1 số là 200, nó chạy trong khoảng đó có thể chênh lệch 50, 51 đồng , 100 đồng em muốn tìm các tổng bên cột C trong khoảng dữ liệu chênh lệch đó so với D2
 
Lần chỉnh sửa cuối:
Upvote 0
vâng em cảm ơn bác ạ
Bài đã được tự động gộp:


nhưng file của em ý là nó ko cố định chênh lệch 1 số là 200, nó chạy trong khoảng đó có thể chênh lệch 50, 51 đồng , 100 đồng em muốn tìm các tổng bên cột C trong khoảng dữ liệu chênh lệch đó so với D2
Kết quả sai à bạn?
Bài đã được tự động gộp:

vâng em cảm ơn bác ạ
Bài đã được tự động gộp:


nhưng file của em ý là nó ko cố định chênh lệch 1 số là 200, nó chạy trong khoảng đó có thể chênh lệch 50, 51 đồng , 100 đồng em muốn tìm các tổng bên cột C trong khoảng dữ liệu chênh lệch đó so với D2
Bạn muốn tất cả các đáp án?
 
Upvote 0
kết quả đúng rồi bác ạ, cái solver này có thể tìm được tất cả các tổ hợp cho ra giá trị chênh lệch với D2 được không bác, xin bác chỉ giúp em ạ
Bài đã được tự động gộp:

Kết quả sai à bạn?
Bài đã được tự động gộp:


Bạn muốn tất cả các đáp án?
vâng, em muốn nó có nhiều đáp án để lựa chọn ấy ạ
 
Upvote 0
Web KT

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

Back
Top Bottom