Tìm tổng các số bằng số cho trước. (1 người xem)

Liên hệ QC

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

Xin chào mọi người, mình đăng bài sau cùng mọi người nghiên cứu lập hàm để giải bài toán tìm các số cộng lại bằng 1 số cho trước:
Chà chà! Nhanh tay quá giờ em đọc mới thấy, bài toán không đơn giản chút nào.
 
Bài này phải dùng thuật toán đệ quy phức tạp bỏ xừ. Vì 5+5 =10, rồi 5+3+2=10, rồi 5+4+1 cũng bằng 10.... Nói chung code được nhưng nhức đầu lắm
 
Bài này hàm thì không làm được rồi bạn à. Có code hoặc dùng công cụ có sẵn của excel thôi
 
Xin chào mọi người, mình đăng bài sau cùng mọi người nghiên cứu lập hàm để giải bài toán tìm các số cộng lại bằng 1 số cho trước:
Bài này đợt trước mình có đọc 1 trang wed nước ngoài (không nhớ link), có dùng công thức nhưng phức tạp lắm.
 
Xin chào mọi người, mình đăng bài sau cùng mọi người nghiên cứu lập hàm để giải bài toán tìm các số cộng lại bằng 1 số cho trước:
Bài này phải dùng thuật toán đệ quy phức tạp bỏ xừ. Vì 5+5 =10, rồi 5+3+2=10, rồi 5+4+1 cũng bằng 10.... Nói chung code được nhưng nhức đầu lắm
Bài này đợt trước mình có đọc 1 trang wed nước ngoài (không nhớ link), có dùng công thức nhưng phức tạp lắm.
Nếu dùng hàm tự tạo thì các Anh và các bạn thử tham khảo thử link dưới nhé:

Hoặc dùng thử file đính kèm nhé!
1593057314862.png

PHP:
Option Explicit
Private counters() As Long
Public Function FindTargetValue(searchRange As Range, targetValue As Double, Optional maxValues) As String

Dim valueCount As Long
Dim maxLoop As Long

' Set the maximum size of the result set
maxLoop = searchRange.Count
If Not IsMissing(maxValues) Then maxLoop = CLng(maxValues)

' Set up the array only once
ReDim counters(maxLoop) As Long

' Look for combinations that add up to the total; start with 1!
For valueCount = 1 To maxLoop
    FindTargetValue = TryCombination(searchRange, targetValue, valueCount)
    If FindTargetValue <> "" Then Exit For
Next valueCount

' Default result
If FindTargetValue = "" Then FindTargetValue = "Not Found"

End Function
Private Function TryCombination(searchRange As Range, targetValue As Double, valueCount As Long) As String

Dim i As Long
Dim j As Long
Dim k As Long
Dim thisValue As Double
Dim statusUpdate As String

For i = 0 To valueCount - 1
    counters(i) = i + 1
Next i

Do
    ' Total for the current selection
    thisValue = 0
   
    ' Which counter we'll increment
    k = valueCount - 1
   
    ' Add up the totals for the current selection
    For i = 0 To valueCount - 1
        thisValue = thisValue + searchRange(counters(i)).Value
       
        ' No point continuing if we exceed the value early
        If Round(thisValue, 2) > Round(targetValue, 2) Then
            k = i
            Exit For
        End If
    Next i
   
    ' Check if we found a solution and, if so, return it
    If Round(thisValue, 2) = Round(targetValue, 2) Then
        TryCombination = searchRange(counters(0)).Address
        For i = 1 To valueCount - 1
            TryCombination = TryCombination & ", " & searchRange(counters(i)).Address
        Next i
        Exit Function
    End If
   
    ' Fetch the next combination
    i = k
    Do
        counters(i) = counters(i) + 1
       
        ' Have we exceeded the value for this counter?
        If counters(i) > searchRange.Count - (valueCount - 1 - i) Then
            ' Increment the previous one
            i = i - 1
        Else
            ' Set up subsequent counters
            For j = i + 1 To valueCount - 1
                counters(j) = counters(i) + j - i
            Next j
           
            ' Ready to test next combination
            Exit Do
        End If
    Loop Until i < 0
   
    ' If i < 0 then we've tested all possible combinations
Loop Until i < 0

End Function

Hàm tự tạo tại ô A3:
Mã:
=FindTargetValue($C$1:$K$1,A2,ROWS($C$1:C4))
 

File đính kèm

Xin chào mọi người, mình đăng bài sau cùng mọi người nghiên cứu lập hàm để giải bài toán tìm các số cộng lại bằng 1 số cho trước:
Khai báo tính năng "tính vòng" trong Option của Excel
Nhập công thức
Mã:
C2 =N(($A$2>SUMPRODUCT(D1:K1,D2:K2)+IFERROR(SUMPRODUCT($B$1:B1,$B$2:B2),0)))
Copy ngang tới ô K2
Khi A2 thay đổi, nếu kết quả không đúng, xóa công thức các ô D2:K2 và copy lại
 

File đính kèm

Ít số thì dùng công thức được. Công thức mảng, kéo xuống để có các kết quả khác.
Mã:
=DEC2BIN(SMALL(IF(MMULT(MID(DEC2BIN(ROW($1:$511),9),COLUMN($A:$I),1)*$C$1:$K$1,SIGN(ROW($1:$9)))=$A$2,ROW($1:$511),""),ROW(A1)),9)
 
Ít số thì dùng công thức được. Công thức mảng, kéo xuống để có các kết quả khác.
Mã:
=DEC2BIN(SMALL(IF(MMULT(MID(DEC2BIN(ROW($1:$511),9),COLUMN($A:$I),1)*$C$1:$K$1,SIGN(ROW($1:$9)))=$A$2,ROW($1:$511),""),ROW(A1)),9)
Công thức dùng dec2bin giới hạn chiều dài đúng 9 số, hơn thì phải cách khác.
 

File đính kèm

Web KT

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

Back
Top Bottom