em có một file excel, nhờ anh chị tính tổng dùm em với ạ (1 người xem)

Liên hệ QC

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

là e muốn lấy ra số lượng 335 để xuất hàng, nhưng thay vì dùng máy tính để cộng, thì có hàm nào làm được không ạ
 
Bạn mô tả chi tiết hơn, nhìn vào chẳng hiểu bạn muốn gì luôn. Nêu cụ thể vấn đề mong muốn và ví dụ minh họa cụ thể.nhờ

Bạn mô tả chi tiết hơn, nhìn vào chẳng hiểu bạn muốn gì luôn. Nêu cụ thể vấn đề mong muốn và ví dụ minh họa cụ thể.
nhờ bạn giải thích rỏ hơn dùm ạ,vì mình không biết dùng VBA, hay bạn chưa hiểu ý mình để mình giải thích thêm ạ
 
ví dụ giờ mình có số lượng
100
200
150
50
30
20
15
55
75

mình cần xuất hàng số lượng là 470 ( 150+50+15+55+200 )
thay vì ngồi lấy máy tính cộng lại sẽ mất thời gian, cho mình hỏi có công thức nào lấy ra được những giá trị như vậy không ạ ?
 
Mò thử solver hay goal seek xem, tui không rành lắm.
 
Rõ khổ, tại sao mô tả một bài toán mà xoắn xít vào nhau thế.
Mười mấy năm học tiếng Việt thì cũng tới lúc vận dụng chứ.

Viết như thế này:

Cho trước một dãy số (số lượng gì đó) tại cột A.
Điều kiện đầu vào cho một giá trị cụ thể là x.
Yêu cầu cần làm:
Lựa chọn các số trong cột A, một giá trị chỉ lấy 1 lần, sao cho tổng các giá trị cần lấy gần với giá trị x nhất (bằng giá trị x, hoặc lớn hơn/ nhỏ hơn gần nhất với x). Gần nhất là bao nhiêu thì phải thêm điều kiện này vào.

Chốt hạ. Từ khóa Solver. Tìm trong diễn đàn này có nhiều bài rồi.
 
Rõ khổ, tại sao mô tả một bài toán mà xoắn xít vào nhau thế.
Mười mấy năm học tiếng Việt thì cũng tới lúc vận dụng chứ.

Viết như thế này:

Cho trước một dãy số (số lượng gì đó) tại cột A.
Điều kiện đầu vào cho một giá trị cụ thể là x.
Yêu cầu cần làm:
Lựa chọn các số trong cột A, một giá trị chỉ lấy 1 lần, sao cho tổng các giá trị cần lấy gần với giá trị x nhất (bằng giá trị x, hoặc lớn hơn/ nhỏ hơn gần nhất với x). Gần nhất là bao nhiêu thì phải thêm điều kiện này vào.

Chốt hạ. Từ khóa Solver. Tìm trong diễn đàn này có nhiều bài rồi.
lấy chính xác nha anh, nhờ anh giải giùm cho e với, chứ em tìm rồi em cũng không biết cách làm
thanks anh nha !
 
ví dụ giờ mình có số lượng
100
200
150
50
30
20
15
55
75

mình cần xuất hàng số lượng là 470 ( 150+50+15+55+200 )
thay vì ngồi lấy máy tính cộng lại sẽ mất thời gian, cho mình hỏi có công thức nào lấy ra được những giá trị như vậy không ạ ?
Bài toán này cần phải dùng đến VBA. Bạn có biết sử dụng VBA hay không? Thấy phía trên bạn có đề cập không muốn xài VBA thì phải?
 
Solver còn vã mồ hôi hột. Giờ có người viết VBA thay cho Solver. Hay thật. Lót dép hóng.
 
là e muốn lấy ra số lượng 335 để xuất hàng, nhưng thay vì dùng máy tính để cộng, thì có hàm nào làm được không ạ
Bạn thử tải file về coi xài được không. Chắc có thể sẽ còn phát sinh linh tinh. Hy vọng giúp được ít nhiều cho bạn
Nhớ tìm cách enable macros nhé
 

File đính kèm

Rõ khổ, tại sao mô tả một bài toán mà xoắn xít vào nhau thế.
Mười mấy năm học tiếng Việt thì cũng tới lúc vận dụng chứ.
...
Bạn mới là người ngây thơ.
Người ta phải tung hoả mù trước để quý vị không nhận ra loại báo cáo.
Điển hình, cuối kỳ có con số hàng bán bị nổi lên (nổi = tồn kho trên giấy tờ - tồn kho thực tế). Bi giờ bài toán là viết một mớ biên lai thanh toán con số nổi này.
 
Lần chỉnh sửa cuối:
Bạn mới là người ngây thơ.
Người ta phải tung hoả mù trước để quý vị không nhận ra loại báo cáo.
Điển hình, cuối kỳ có con số hàng bán bị nổi lên (nổi = tồn kho trên giấy tờ - tồn kho thực tế). Bi giờ bài toán là viết một mớ biên lai thanh toán con số nổi này.
không phải nha bạn, t chỉ làm nhập xuất bình thường thôi, t không làm được nên mới nhờ á
 
Phần tô màu xanh giữ nguyên, gia trị cần tìm thay đổi tại E2.

Sau khi chạy, trong vùng C2:C21, giá trị nào = 1 -> lấy giá trị cột A tại dòng đó.
thanks anh nhiều nha !
Bài đã được tự động gộp:

Bạn thử tải file về coi xài được không. Chắc có thể sẽ còn phát sinh linh tinh. Hy vọng giúp được ít nhiều cho bạn
Nhớ tìm cách enable macros nhé
em chọn 700 thì nó chỉ tô vàng 600,còn chọn 800 thì tô vàng 700,nhờ anh chỉnh sửa dùm với ạ
 

File đính kèm

  • image_2021_05_17T12_48_08_667Z.png
    image_2021_05_17T12_48_08_667Z.png
    236.2 KB · Đọc: 11
Lần chỉnh sửa cuối:
thanks anh nhiều nha !
Bài đã được tự động gộp:


em chọn 700 thì nó chỉ tô vàng 600,còn chọn 800 thì tô vàng 700,nhờ anh chỉnh sửa dùm với ạ
Mình biết nguyên nhân tại sao rồi, vì có 2 số 100 nên bị như vậy. Khi nào mình ngồi máy tính sẽ gợi ý giải pháp cho bạn. Chắc đến cuối tuần mình mới về văn phòng. Mong có ai đó sửa dùm
 
@chi ngan nguyen
Thử sửa code bài 14, dùng thử

Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
       
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Mã:
Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
 

File đính kèm

@chi ngan nguyen
Thử sửa code bài 14, dùng thử

Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
      
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Mã:
Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
Những dạng nầy không dể nuốt, lúc đầu chỉ tìm 1 số, sẽ tìm tiếp số thứ 2, 3 ...
 

File đính kèm

Những dạng nầy không dể nuốt, lúc đầu chỉ tìm 1 số, sẽ tìm tiếp số thứ 2, 3 ...
Không hiểu ý bác lắm.

Code trên sửa lại muốn giũ nguyên ý code cũ, chỉ thay đổi cách hiển thị xuống sheet.
Nếu là tự làm sẽ thêm "exit for" trong cái "if cot ...end" để hiển thị chỉ 1 kết quả
 
@chi ngan nguyen
Thử sửa code bài 14, dùng thử

Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
      
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Mã:
Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
thanks bạn nhiều nha
 
@ Thớt
Thêm lệnh thoát vòng lặp, kiểm tra lại xem sao
Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
        
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
        
        Exit For '<-----------------
        
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
 

File đính kèm

@ Thớt
Thêm lệnh thoát vòng lặp, kiểm tra lại xem sao
Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
       
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
       
        Exit For '<-----------------
       
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
Nếu tìm không có số lượng cần lấy thì máy cũng vẫn quay vòng không thoát được nha bạn, nhờ bạn vô sửa thêm với ạ
 

File đính kèm

  • image_2021_05_18T08_44_02_804Z.png
    image_2021_05_18T08_44_02_804Z.png
    52.6 KB · Đọc: 7
@ Thớt
Thêm lệnh thoát vòng lặp, kiểm tra lại xem sao
Mã:
Option Explicit
Dim MgNguon(), MgKQ()

Sub A_KiemTra()
Dim k As Long, KQi() As Double, Cot As Long, n As Long, Tong As Double, Item, Tim As Range
Tong = [C1].Value
MgNguon = Range("A2", Range("A" & Rows.Count).End(3)).Value
Range("A2", Range("A" & Rows.Count).End(3)).Interior.ColorIndex = xlNone
n = UBound(MgNguon, 1)
ReDim MgKQ(1 To n, 1 To 1)
   For k = 1 To n
      ReDim KQi(1 To k, 1 To 1) As Double
      Main k, KQi, 0, 1, 1, Cot, n, Tong
      If Cot Then
         Dim i, j
       
         k = 2
         For i = 1 To n
            If MgKQ(i, 1) = "" Or k > Range("A" & Rows.Count).End(3).Row Then Exit For
            Item = MgKQ(i, 1)
            For j = k To Range("A" & Rows.Count).End(3).Row
                If Range("A" & j) = Item Then
                    Range("A" & j).Interior.ColorIndex = 3
                    k = j + 1
                    Exit For
                End If
            Next j
        Next i
       
        Exit For '<-----------------
       
      End If
   Next
Erase MgNguon:  Erase MgKQ
End Sub

Sub Main(k As Long, KQi, CongDon As Double, PhanTu As Long, SoDem As Long, Cot As Long, n As Long, Tong As Double)
Dim i As Long, j As Long
If Cot Then Exit Sub
If SoDem <= k Then
   For j = PhanTu To n - k + SoDem
      KQi(SoDem, 1) = MgNguon(j, 1)
      Main k, KQi, CongDon + KQi(SoDem, 1), j + 1, SoDem + 1, Cot, n, Tong
   Next j
Else
   If CongDon = Tong Then
      Cot = Cot + 1
      ReDim Preserve MgKQ(1 To n, 1 To Cot)
      For i = 1 To k
         MgKQ(i, Cot) = KQi(i, 1)
      Next
   End If
End If
End Sub
Mình thấy dòng lệnh này chạy được rồi nhưng với tìm tổng nhỏ hơn 1000 và dãy số không quá 20 dòng, mình test thử tìm tổng trên 2000 và dãy số là 40 dòng là chạy 5 phút không ra kết quả.
 
Nếu tìm không có số lượng cần lấy thì máy cũng vẫn quay vòng không thoát được nha bạn, nhờ bạn vô sửa thêm với ạ
Dữ liệu nhiều quá sẽ đứng máy
Mã:
Function SumFind(Total As Double, ParamArray RngS() As Variant) As String
  Dim Data(), Cll As Range, Arr(), tmp, tSum As Double
  Dim i As Long, n As Long, k As Long
 
  For i = LBound(RngS) To UBound(RngS)
    For Each Cll In RngS(i)
      tmp = Val(Cll.Value)
      If tmp <> 0 Then
        If tmp = Total Then
          SumF1 = Cll.Address(0, 0): Exit Function
        Else
          n = n + 1
          ReDim Preserve Data(1 To 2, 1 To n)
          Data(1, n) = Val(Cll.Value):  Data(2, n) = Cll.Address(1, 0)
        End If
      End If
    Next
  Next
  Call QuickSort(Data)
  ReDim Arr(1 To n)
  Arr(1) = 1:     tSum = Data(1, 1)
  n = 1:          k = 1
  Do While Total <> tSum
    If Arr(1) = UBound(Data, 2) Then
      SumF1 = "#N/A":        Exit Function
    End If
    If tSum > Total Then
      k = Arr(n - 1) + 1
      tSum = tSum - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
      n = n - 1
      Arr(n) = k
    Else
      If k = UBound(Data, 2) Then
        k = Arr(n - 1) + 1
        tSum = tSum - Data(1, Arr(n)) - Data(1, Arr(n - 1)) + Data(1, k)
        n = n - 1
        Arr(n) = k
      Else
        k = k + 1
        tSum = tSum + Data(1, k)
        n = n + 1
        Arr(n) = k
      End If
    End If
  Loop
  SumFind = GetRes(Data, Arr, n)
End Function

Private Sub QuickSort(Data)
  Dim oSList As Object, sArr, S
  Dim j As Long, k As Long, jk As Long, m As Long

  Set oSList = CreateObject("System.Collections.SortedList")
  For j = LBound(Data, 2) To UBound(Data, 2)
    oSList.Item(Data(1, j)) = oSList.Item(Data(1, j)) & "," & j
  Next j
  sArr = Data
  For j = 0 To oSList.Count - 1
    S = Split(oSList.GetByIndex(j), ",")
    For m = 1 To UBound(S)
      jk = CLng(S(m))
        k = k + 1
        Data(1, k) = sArr(1, jk): Data(2, k) = sArr(2, jk)
    Next m
  Next j
  Set oSList = Nothing
End Sub

Private Function GetRes(Data, Arr, n) As String
  Dim oSList As Object, sArr, S, iKey, tmp
  Dim j As Long, k As Long, jk As Long, m As Long

  Set oSList = CreateObject("System.Collections.SortedList")
  For j = 1 To n
    tmp = CLng(Split(Data(2, Arr(j)), "$")(1))
    oSList.Item(tmp) = oSList.Item(tmp) & "," & j
  Next j
  tmp = Empty
  For j = 0 To oSList.Count - 1
    S = Split(oSList.GetByIndex(j), ",")
    For m = 1 To UBound(S)
      jk = CLng(S(m))
      tmp = tmp & "+" & Data(2, Arr(jk))
    Next m
  Next j
  tmp = Replace(tmp, "$", "")
  GetRes = "=" & Mid(tmp, 2, Len(tmp) - 1)
  Set oSList = Nothing
End Function
Công thức trong file
Mã:
C4 =SumFind(C1,A2:A21)
 

File đính kèm

Đây là bài toán tìm tổng con (subset sum). Mình cũng viết mấy bài ở GPE tìm tổng con bằng quy hoạch động dùng VBA (vì mình cũng thỉnh thoảng phải "bốc thuốc"): với n số nguyên dương cho trước, tìm bộ số có tổng = S, bài toán này có khi không giải nổi nếu n và s lớn. Nếu n nhỏ khoảng vài chục thì dùng đệ quy cho dễ viết code, độ phức tạp phụ thuộc vào n. Nếu n cao hơn thì dùng đệ quy dễ tràn stack, lúc này nên dùng quy hoạch động và độ phức tạp phụ thuộc cả vào n và s.
@chi ngan nguyen bạn nên đưa dữ liệu gần giống thực lên, lúc đấy mọi người sẽ có code phù hợp.
Ví dụ code bài của mình ở link dưới, dữ liệu cần được sort tăng dần trước khi chạy, bạn thử xem chạy được không, nếu dữ liệu lớn hơn thì bạn cứ báo, mình sẽ đưa công cụ khác.
 
mình vẫn chưa hiểu file này luôn bạn à, bạn nói lại cho mình đi.
bài này dùng solver để giải, bạn tìm với từ khóa solver trên diễn đàn xem.
Bài đã được tự động gộp:

Mình thấy dòng lệnh này chạy được rồi nhưng với tìm tổng nhỏ hơn 1000 và dãy số không quá 20 dòng, mình test thử tìm tổng trên 2000 và dãy số là 40 dòng là chạy 5 phút không ra kết quả.
Bân thử với file bài 16 xem sao, số dòng <=200
 
Đây là bài toán tìm tổng con (subset sum). Mình cũng viết mấy bài ở GPE tìm tổng con bằng quy hoạch động dùng VBA (vì mình cũng thỉnh thoảng phải "bốc thuốc"): với n số nguyên dương cho trước, tìm bộ số có tổng = S, bài toán này có khi không giải nổi nếu n và s lớn. Nếu n nhỏ khoảng vài chục thì dùng đệ quy cho dễ viết code, độ phức tạp phụ thuộc vào n. Nếu n cao hơn thì dùng đệ quy dễ tràn stack, lúc này nên dùng quy hoạch động và độ phức tạp phụ thuộc cả vào n và s.
@chi ngan nguyen bạn nên đưa dữ liệu gần giống thực lên, lúc đấy mọi người sẽ có code phù hợp.
Ví dụ code bài của mình ở link dưới, dữ liệu cần được sort tăng dần trước khi chạy, bạn thử xem chạy được không, nếu dữ liệu lớn hơn thì bạn cứ báo, mình sẽ đưa công cụ khác.
vì file mình rất nhiều loại hàng khác nhau, mỗi lần cần tính toán thì mình phải coppy dữ liệu qua file mình đưa lên đây, nhưng số dòng sẽ ít hơn 100,nên mình muốn nhờ bạn làm 1 file mẫu, cứ có dữ diệu là mình coppy qua, nếu lấy hàng khác thì lại xóa loại hàng đó,rồi coppy loại hàng cần lấy lên để file tự tính ạ
 
Đã bảo là dùng Solver rồi.
Thay vì nhọc công theo đuổi cái gì đó thì bỏ 30 phút ra đọc cách sử dụng Solver. Sau đó hoàn toàn tự bản thân mình xử lý được việc. Ngon lành.
 
vì file mình rất nhiều loại hàng khác nhau, mỗi lần cần tính toán thì mình phải coppy dữ liệu qua file mình đưa lên đây, nhưng số dòng sẽ ít hơn 100,nên mình muốn nhờ bạn làm 1 file mẫu, cứ có dữ diệu là mình coppy qua, nếu lấy hàng khác thì lại xóa loại hàng đó,rồi coppy loại hàng cần lấy lên để file tự tính ạ
Bài 39 mình có đưa link code mà bạn, nếu tổng cần tính khoảng trăm triệu trở lên thì nên dùng cách khác.
 

File đính kèm

mình tính toán ít à, mà mình lại chưa hiểu file đó chạy như thế nào, bạn nói rỏ hơn dùm ạ
Bạn copy các số vào cột A (chỉ số nguyên dương thôi nhé), nhập tổng vào ô bôi vàng rồi bấm nút ABC. Chú ý nếu tổng lớn vài chục triệu trở lên thì cần dùng phương pháp khác, mình cũng đã làm rồi nhưng không tiện đưa lên do đã biên dịch ra file exe, nếu bạn cần thì mình sẽ gửi.
 

File đính kèm

Như đã hứa, hôm nay mình đã sửa code theo giải pháp không tô màu. Có thể sẽ chưa hoàn thiện nhưng cũng là 1 giải pháp tạm
cám ơn a nhiều nhiều nha, nhưng file của a, nếu nhập số liệu không có trong đó, thì file bị lỗi nha a, nó quay vòng không dừng lại luôn, nhờ a tìm thêm giải pháp ạ
 

File đính kèm

  • ABC.png
    ABC.png
    76.2 KB · Đọc: 3
Bạn copy các số vào cột A (chỉ số nguyên dương thôi nhé), nhập tổng vào ô bôi vàng rồi bấm nút ABC. Chú ý nếu tổng lớn vài chục triệu trở lên thì cần dùng phương pháp khác, mình cũng đã làm rồi nhưng không tiện đưa lên do đã biên dịch ra file exe, nếu bạn cần thì mình sẽ gửi.
file của bạn m đã làm thử nhưng số liệu gần đúng chứ không đúng ạ chính xác ạ
 

File đính kèm

  • image_2021_05_20T09_16_13_359Z.png
    image_2021_05_20T09_16_13_359Z.png
    53.1 KB · Đọc: 9
@chi ngan nguyen
Vậy là vấn đề của bạn đã giải quyết được hay chưa?
chưa ạ, nếu tìm không đúng số lượng, thì file vẫn chạy vòng vòng ạ
Bài đã được tự động gộp:

Bạn gửi lại cho mình file có dữ liệu đó, có khả năng do mình sửa code cũ bị sót.
giờ file lại chạy được rồi nha bạn, thanks bạn nha
 
Vậy chắc là do số 1 dòng trên cùng bị nút filter che khuất.
 
File của em đã sử dụng ok rồi nha.
cám ơn tất cả mọi người đã giúp đỡ ạ
em chúc mọi người luôn dồi dào sức khỏe để vượt qua dịch covis 19 ạ.
Bài đã được tự động gộp:

Vậy chắc là do số 1 dòng trên cùng bị nút filter che khuất.
đúng rồi đó bạn, cám ơn bạn nha,chúc bạn sức khỏe ạ !
 

File đính kèm

hì,thanks bạn nha, mà file bạn gữi qua t k mở đc, bạn chỉ cách t mở với ạ
 

File đính kèm

  • rev.png
    rev.png
    336.3 KB · Đọc: 9

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

Back
Top Bottom