[Nhờ giúp đỡ] Chọn n mã hàng ngẫu nhiên sao cho tổng giá tiền bằng một số cho trước (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

Lá chanh

Thành viên mới
Tham gia
28/6/23
Bài viết
26
Được thích
4
Mình đang gặp vấn đề khó khăn. Xin nhờ mọi người giúp đỡ ạ.
Vấn đề của mình như sau:
Mình có 1 bảng ghi giá của từng sản phẩm.
Giờ cho trước một số tiền, và cho trước số lượng mã hàng cần mua. Việc của mình là phải làm sao tìm được các mã hàng đó tương ứng là khối lượng của các mã hàng ( khối lượng các mã hàng thì không nên bằng nhau nhưng cũng không nên chênh lệch quá lớn), làm sao cho tổng tiền sẽ bằng hoặc nhỏ hơn gần nhất với số tiền cho trước.
Có thể tạo cột phụ thoải mái, Nếu có thể thì dùng công thức còn nếu không thì cũng có thể dùng VBA.
Mình có đính kèm file.
Rất mong được mọi người giúp đỡ!
 

File đính kèm

AI cho bạn code tham khảo,code này chạy hơi lâu và cũng chưa đáp ứng được 10 % của bạn. ah sửa lại file bạn chút
  • Tại ô F1, nhập vào ngân sách của bạn (ví dụ: 18000000).
  • Tại ô F2, nhập vào số mã hàng cần mua (ví dụ: 5).
PHP:
' Bật tham chiếu đến "Microsoft Scripting Runtime"
' Bằng cách vào Tools -> References -> Tích vào "Microsoft Scripting Runtime" trong cửa sổ VBA Editor.

Option Explicit

Sub TimKiemToHopSanPham()
    ' --- THIẾT LẬP CÁC THAM SỐ ---
    Dim wsData As Worksheet
    Set wsData = ThisWorkbook.Sheets("Sheet1") ' << Thay "Sheet1" bằng tên sheet chứa dữ liệu của bạn

    Dim targetValue As Double
    Dim numProductsToBuy As Integer
    Dim numIterations As Long
    
    On Error Resume Next
    targetValue = CDbl(wsData.Range("F1").Value)
    numProductsToBuy = CInt(wsData.Range("F2").Value)
    If Err.Number <> 0 Then
        MsgBox "Vui lòng kiểm tra lại giá trị tại ô F1 và F2. F1 phải là số tiền, F2 phải là số lượng mã hàng.", vbCritical, "Lỗi Dữ Liệu Đầu Vào"
        Exit Sub
    End If
    On Error GoTo 0

    numIterations = 100000 ' Số lần thử, có thể tăng lên để kết quả tốt hơn nhưng sẽ lâu hơn

    ' --- KIỂM TRA ĐẦU VÀO ---
    If targetValue <= 0 Or numProductsToBuy <= 0 Then
        MsgBox "Số tiền và số mã hàng phải lớn hơn 0.", vbExclamation, "Dữ Liệu Không Hợp Lệ"
        Exit Sub
    End If
    
    Application.ScreenUpdating = False

    ' --- ĐỌC DỮ LIỆU SẢN PHẨM ---
    Dim lastRow As Long
    lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    
    If lastRow < 3 Then
        MsgBox "Không tìm thấy dữ liệu sản phẩm.", vbExclamation, "Lỗi Dữ Liệu"
        Exit Sub
    End If
    
    Dim allProducts As Variant
    allProducts = wsData.Range("A3:C" & lastRow).Value
    
    Dim totalProductCount As Long
    totalProductCount = UBound(allProducts, 1)

    If numProductsToBuy > totalProductCount Then
        MsgBox "Số mã hàng cần mua (" & numProductsToBuy & ") lớn hơn tổng số mã hàng có trong danh sách (" & totalProductCount & ").", vbExclamation, "Lỗi"
        Exit Sub
    End If

    ' --- KHỞI TẠO BIẾN LƯU KẾT QUẢ TỐT NHẤT ---
    Dim bestCost As Double
    Dim bestCombination As Object 'Sử dụng Dictionary
    Set bestCombination = Nothing
    bestCost = 0
    
    Randomize ' Khởi tạo bộ sinh số ngẫu nhiên

    ' --- BẮT ĐẦU VÒNG LẶP TÌM KIẾM ---
    Dim i As Long
    For i = 1 To numIterations
        ' Lấy ngẫu nhiên N sản phẩm
        Dim currentProducts As Variant
        currentProducts = GetRandomProducts(allProducts, numProductsToBuy)
        
        ' Tính toán khối lượng và chi phí cho các sản phẩm đã chọn
        Dim currentSolution As Object
        Set currentSolution = CalculateQuantitiesAndCost(currentProducts, targetValue)
        
        If Not currentSolution Is Nothing Then
            Dim currentCost As Double
            currentCost = currentSolution("TotalCost")
            
            ' Nếu kết quả hiện tại tốt hơn kết quả tốt nhất đã lưu -> Cập nhật
            If currentCost > bestCost Then
                bestCost = currentCost
                Set bestCombination = currentSolution
            End If
        End If
    Next i

    ' --- HIỂN THỊ KẾT QUẢ ---
    DisplayResults bestCombination, targetValue
    
    Application.ScreenUpdating = True
    
    MsgBox "Hoàn tất! Kiểm tra sheet 'KetQua' để xem kết quả.", vbInformation, "Thông Báo"
End Sub

Private Function GetRandomProducts(ByVal allProducts As Variant, ByVal count As Integer) As Variant
    ' Hàm này lấy ra 'count' sản phẩm ngẫu nhiên không trùng lặp từ danh sách
    Dim productCount As Long
    productCount = UBound(allProducts, 1)
    
    Dim indices As Object
    Set indices = CreateObject("System.Collections.ArrayList")
    Dim i As Long
    For i = 1 To productCount
        indices.Add i
    Next i
    
    Dim selectedProducts() As Variant
    ReDim selectedProducts(1 To count, 1 To 3)
    
    Dim r As Long
    Dim selectedIndex As Long
    
    For i = 1 To count
        r = Int(indices.Count * Rnd())
        selectedIndex = indices(r)
        
        selectedProducts(i, 1) = allProducts(selectedIndex, 1) ' Tên
        selectedProducts(i, 2) = allProducts(selectedIndex, 2) ' Đơn vị
        selectedProducts(i, 3) = allProducts(selectedIndex, 3) ' Đơn giá
        
        indices.RemoveAt r
    Next i
    
    GetRandomProducts = selectedProducts
End Function

'---------------------------------------------------------------------------------------
'   HÀM ĐÃ ĐƯỢC CẬP NHẬT ĐỂ TRẢ VỀ SỐ LƯỢNG NGUYÊN
'---------------------------------------------------------------------------------------
Private Function CalculateQuantitiesAndCost(ByVal selectedProducts As Variant, ByVal target As Double) As Object
    ' Hàm này tính toán khối lượng NGUYÊN để tối ưu hóa chi phí
    Dim num As Integer
    num = UBound(selectedProducts, 1)
    
    Dim prices() As Double
    ReDim prices(1 To num)
    Dim weights() As Double
    ReDim weights(1 To num)
    
    Dim totalWeightedPrice As Double
    totalWeightedPrice = 0
    
    Dim j As Integer
    For j = 1 To num
        ' Tạo các trọng số ngẫu nhiên không quá chênh lệch
        weights(j) = 0.85 + Rnd() * 0.3
        prices(j) = CDbl(selectedProducts(j, 3))
        totalWeightedPrice = totalWeightedPrice + prices(j) * weights(j)
    Next j
    
    If totalWeightedPrice = 0 Then Exit Function
    
    Dim scaleFactor As Double
    scaleFactor = target / totalWeightedPrice
    
    Dim totalCost As Double
    totalCost = 0
    
    Dim quantities() As Long
    ReDim quantities(1 To num)
    
    ' Bước 1: Tính toán số lượng nguyên ban đầu và tổng chi phí
    For j = 1 To num
        quantities(j) = Int(scaleFactor * weights(j))
        totalCost = totalCost + quantities(j) * prices(j)
    Next j
    
    ' Bước 2: Tối ưu hóa bằng cách thêm từng sản phẩm một cho đến khi gần hết ngân sách
    Dim remainingBudget As Double
    remainingBudget = target - totalCost
    
    Dim budgetWasSpent As Boolean
    Do
        budgetWasSpent = False
        Dim cheapestProductIndex As Integer
        cheapestProductIndex = -1
        Dim minPrice As Double
        minPrice = -1

        ' Tìm sản phẩm rẻ nhất có thể mua được với ngân sách còn lại
        For j = 1 To num
            If prices(j) <= remainingBudget And prices(j) > 0 Then
                If minPrice = -1 Or prices(j) < minPrice Then
                    minPrice = prices(j)
                    cheapestProductIndex = j
                End If
            End If
        Next j
        
        ' Nếu tìm thấy, thêm 1 đơn vị và cập nhật lại chi phí
        If cheapestProductIndex <> -1 Then
            quantities(cheapestProductIndex) = quantities(cheapestProductIndex) + 1
            totalCost = totalCost + prices(cheapestProductIndex)
            remainingBudget = remainingBudget - prices(cheapestProductIndex)
            budgetWasSpent = True
        End If
    Loop While budgetWasSpent ' Lặp lại nếu vẫn còn có thể mua thêm

    ' Bước 3: Tạo đối tượng kết quả để trả về
    Dim resultsDict As Object
    Set resultsDict = CreateObject("Scripting.Dictionary")
    
    Dim itemsCollection As Collection
    Set itemsCollection = New Collection
    
    For j = 1 To num
        Dim itemDict As Object
        Set itemDict = CreateObject("Scripting.Dictionary")
        itemDict.Add "Name", selectedProducts(j, 1)
        itemDict.Add "Quantity", quantities(j)
        itemDict.Add "Price", prices(j)
        itemDict.Add "SubTotal", quantities(j) * prices(j)
        itemsCollection.Add itemDict
    Next j
    
    resultsDict.Add "Items", itemsCollection
    resultsDict.Add "TotalCost", totalCost
    
    Set CalculateQuantitiesAndCost = resultsDict
End Function

Private Sub DisplayResults(ByVal result As Object, ByVal target As Double)
    ' Hàm này hiển thị kết quả ra một sheet mới
    If result Is Nothing Then
        MsgBox "Không tìm thấy tổ hợp nào phù hợp.", vbExclamation, "Không Có Kết Quả"
        Exit Sub
    End If
    
    Dim wsResult As Worksheet
    On Error Resume Next
    ThisWorkbook.Worksheets("KetQua").Delete
    On Error GoTo 0
    
    Set wsResult = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    wsResult.Name = "KetQua"
    
    With wsResult
        .Range("A1").Value = "KẾT QUẢ TỐI ƯU HÓA ĐƠN HÀNG"
        .Range("A1:D1").Merge
        .Range("A1").Font.Bold = True
        .Range("A1").Font.Size = 14
        .Range("A1").HorizontalAlignment = xlCenter
        
        .Range("A3").Value = "Tên hàng"
        .Range("B3").Value = "Số lượng" 'Đổi tên cột
        .Range("C3").Value = "Đơn giá"
        .Range("D3").Value = "Thành tiền"
        .Range("A3:D3").Font.Bold = True
        
        Dim items As Collection
        Set items = result("Items")
        
        Dim i As Integer
        For i = 1 To items.Count
            .Cells(i + 3, 1).Value = items(i)("Name")
            .Cells(i + 3, 2).Value = items(i)("Quantity")
            .Cells(i + 3, 3).Value = items(i)("Price")
            .Cells(i + 3, 4).Value = items(i)("SubTotal")
        Next i
        
        Dim lastDataRow As Long
        lastDataRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        
        .Cells(lastDataRow + 1, 3).Value = "Tổng cộng"
        .Cells(lastDataRow + 1, 3).Font.Bold = True
        .Cells(lastDataRow + 1, 4).Formula = "=SUM(D4:D" & lastDataRow & ")"
        .Cells(lastDataRow + 1, 4).Font.Bold = True
        
        .Cells(lastDataRow + 3, 3).Value = "Ngân sách"
        .Cells(lastDataRow + 3, 4).Value = target
        
        .Cells(lastDataRow + 4, 3).Value = "Chênh lệch"
        .Cells(lastDataRow + 4, 4).Formula = "=" & .Cells(lastDataRow + 3, 4).Address(False, False) & "-" & .Cells(lastDataRow + 1, 4).Address(False, False)

        ' Định dạng số
        .Range("C4:D" & lastDataRow + 4).NumberFormat = "#,##0"
        .Range("B4:B" & lastDataRow).NumberFormat = "#,##0" 'Định dạng số lượng là số nguyên
        .Columns("A:D").AutoFit
    End With
End Sub
 
Lần chỉnh sửa cuối:
Công thức cho Office365. Làm cho ra kết quả đã, còn rút gọn hơn chắc tính sau :p
Mã:
=LET(a,A3:C32,b,TAKE(SORTBY(CHOOSECOLS(a,1,3),RANDARRAY(ROWS(a))),I2),c,DROP(b,,1),d,AVERAGE(I1/MAX(c)/I2,I1/MIN(c)/I2),e,RANDARRAY(4,,INT(d*0.9),INT(d),1),f,VSTACK(e,(I1-SUM(DROP(c,-1)*e))/TAKE(c,-1)),HSTACK(TAKE(b,,1),f,c,f*c))
1758548132463.png
 
Mình đang gặp vấn đề khó khăn. Xin nhờ mọi người giúp đỡ ạ.
Vấn đề của mình như sau:
Mình có 1 bảng ghi giá của từng sản phẩm.
Giờ cho trước một số tiền, và cho trước số lượng mã hàng cần mua. Việc của mình là phải làm sao tìm được các mã hàng đó tương ứng là khối lượng của các mã hàng ( khối lượng các mã hàng thì không nên bằng nhau nhưng cũng không nên chênh lệch quá lớn), làm sao cho tổng tiền sẽ bằng hoặc nhỏ hơn gần nhất với số tiền cho trước.
Có thể tạo cột phụ thoải mái, Nếu có thể thì dùng công thức còn nếu không thì cũng có thể dùng VBA.
Mình có đính kèm file.
Rất mong được mọi người giúp đỡ!
Góp vui thêm 1 cách
Nhấn nút " Lựa chọn ngẫu nhiên" để được kết quả. Mỗi lần nhấn nút là được 1 đáp án duy nhất.
Có thể tùy chọn số dòng cần lấy ở G2.
Xem code trong file.
 

File đính kèm

Công thức cho Office365. Làm cho ra kết quả đã, còn rút gọn hơn chắc tính sau :p
Mã:
=LET(a,A3:C32,b,TAKE(SORTBY(CHOOSECOLS(a,1,3),RANDARRAY(ROWS(a))),I2),c,DROP(b,,1),d,AVERAGE(I1/MAX(c)/I2,I1/MIN(c)/I2),e,RANDARRAY(4,,INT(d*0.9),INT(d),1),f,VSTACK(e,(I1-SUM(DROP(c,-1)*e))/TAKE(c,-1)),HSTACK(TAKE(b,,1),f,c,f*c))
View attachment 309750
Trước tiên xin được cảm ơn bác đã giúp đỡ
Em đã đưa công thức vào file và thấy khi chạy với 5 mặt hàng thì OK, đều cho ra kết quả rất hài lòng . Nhưng khi em thay đổi số mặt hàng thành 3 hoặc 2 chẳng hạn thì nó lại không ra kết quả bác ạ. Bác xem lại hộ em với
Bài đã được tự động gộp:

@HUONGHCKT Tuyệt vời bác ạ. cho ra kết quả ứng ý luôn. Cảm ơn bác nhé. Tuy nhiên, bác chỉnh thêm giúp em 1 chút được không? Khi em đưa số tiền từ 360,000,000 trở lên thì nó báo lỗi như hình e đính kèm Bác ạ.
1758594356020.png
 
Lần chỉnh sửa cuối:
Trước tiên xin được cảm ơn bác đã giúp đỡ
Em đã đưa công thức vào file và thấy khi chạy với 5 mặt hàng thì OK, đều cho ra kết quả rất hài lòng . Nhưng khi em thay đổi số mặt hàng thành 3 hoặc 2 chẳng hạn thì nó lại không ra kết quả bác ạ. Bác xem lại hộ em với
Đây nhé bạn. Mình đang để cho randarray số 4 nên bị cố định sai ở đó. Bạn thay lại này nhé (thêm luôn cột thứ tự). Với F1 là số tiền, F2 là số lượng mặt hàng
Mã:
=LET(a,A3:C32,b,TAKE(SORTBY(a,RANDARRAY(ROWS(a))),F2),c,TAKE(b,,-1),d,INT(AVERAGE(F1/c/F2)),e,RANDARRAY(F2-1,,INT(d*0.9),d,1),f,VSTACK(e,(F1-SUM(DROP(c,-1)*e))/TAKE(c,-1)),HSTACK(SEQUENCE(F2),TAKE(b,,1),f,c,f*c))
 
@HUONGHCKT Tuyệt vời bác ạ. cho ra kết quả ứng ý luôn. Cảm ơn bác nhé. Tuy nhiên, bác chỉnh thêm giúp em 1 chút được không? Khi em đưa số tiền từ 360,000,000 trở lên thì nó báo lỗi như hình e đính kèm Bác ạ.
View attachment 309754
Bạn thử thay code cũ bằng code này xem sao?

Mã:
Option Explicit
' By HUONGHCKT
Sub MuaHang()
Dim i&, j&, Lr&, t&, k&, d&, d1&, SL&, R&, Tong&, DU&, V&, SoTien&, Gia&, dong&, M&, M1&, N&, Z&
Dim A As Boolean, B As Boolean, Bl As Boolean
Dim Arr(), KQ()
Dim Rng As Range, Time As Double
Dim Sh As Worksheet, Ws As Worksheet
Time = Timer
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set Sh = Sheets("Sheet1")
    dong = Sh.[G2]
    SoTien = Sh.[G1] * (dong)
    Lr = Sh.Cells(100000, 2).End(3).Row
    Arr = Sh.Range("A3:C" & Lr).Value
    R = UBound(Arr)
Set Rng = Sh.Range("C2:C" & Lr)
    M = Application.Max(Rng)
    M1 = Application.Min(Rng)
    d = Rng.Find(M).Row - 2
    d1 = Rng.Find(M1).Row - 2
    Bl = False: A = False: B = False
ReDim KQ(1 To R, 1 To 5)
For i = 1 To R
    t = t + 1
        KQ(t, 1) = t
        KQ(t, 2) = Arr(i, 1)
        KQ(t, 4) = Arr(i, 3)
        Gia = Gia + KQ(t, 4)
Next i
    SL = Int(SoTien / Gia)
Bl = False
ReDim KQ1(1 To R, 1 To 5)
Do
    Tong = 0: k = 0
    For i = 1 To dong - 1
j = SoNgauNghien(1, UBound(KQ))
        k = k + 1
        KQ1(k, 1) = k
        KQ1(k, 2) = KQ(j, 2)
        KQ1(k, 3) = SoNgauNghien(SL - dong * 10, SL + dong * 10)
        KQ1(k, 4) = KQ(j, 4)
        If j = d Then A = True
        If j = d1 Then B = True
        KQ1(k, 5) = (KQ1(k, 4) * KQ1(k, 3))
        Tong = Tong + KQ1(k, 5)
    Next i
    DU = (SoTien / dong + 1) - Tong
If DU <= M * 100 Then
    If (A = False And B = True) Or (A = False And B = False) Then
        KQ1(dong, 1) = dong
        KQ1(dong, 2) = KQ(d, 2)
        KQ1(dong, 3) = Int(DU / M)
        KQ1(dong, 4) = M
        KQ1(dong, 5) = (KQ1(dong, 3) * M)
         Bl = True: Exit Do
    ElseIf A = True And B = False Then
        KQ1(dong, 1) = dong
        KQ1(dong, 2) = KQ(d1, 2)
        KQ1(dong, 3) = Int(DU / M1)
        KQ1(dong, 4) = M1
        KQ1(dong, 5) = (KQ1(dong, 3) * M1)
        Bl = True: Exit Do
    End If
Else
    For i = 1 To R
        If DU Mod KQ(i, 4) * 20 = 0 Or DU Mod KQ(i, 4) * 20 <= 3 Then
            KQ1(dong, 1) = dong
            KQ1(dong, 2) = Arr(i, 1)
            KQ1(dong, 3) = Int(DU / Arr(i, 3))
            KQ1(dong, 4) = Arr(i, 3)
            KQ1(dong, 5) = (KQ1(dong, 4) * KQ1(dong, 3))
            Bl = True: Exit Do
        End If
    Next i
End If
    If Bl = True Then Exit Do
Loop While DU > M

Sh.Range("E5").Resize(1000, 5).ClearContents
Sh.Range("E5").Resize(dong, 5) = KQ1

Application.ScreenUpdating = True
Application.DisplayAlerts = True

MsgBox "Đa lay đon hàng thành công hêt " & Timer - Time & " giây"

End Sub
 
Lần chỉnh sửa cuối:
Em chạy code mới nó báo lỗi như này bác ơi. giúp em với
1758610202344.png
Bài đã được tự động gộp:

Đây nhé bạn. Mình đang để cho randarray số 4 nên bị cố định sai ở đó. Bạn thay lại này nhé (thêm luôn cột thứ tự). Với F1 là số tiền, F2 là số lượng mặt hàng
Mã:
=LET(a,A3:C32,b,TAKE(SORTBY(a,RANDARRAY(ROWS(a))),F2),c,TAKE(b,,-1),d,INT(AVERAGE(F1/c/F2)),e,RANDARRAY(F2-1,,INT(d*0.9),d,1),f,VSTACK(e,(F1-SUM(DROP(c,-1)*e))/TAKE(c,-1)),HSTACK(SEQUENCE(F2),TAKE(b,,1),f,c,f*c))
Cảm ơn bác rất nhiều!!!
Em hơi tham lam nên đang xin cả cách dùng VBA để dùng cho bản excel 2016 ở công ty nữa. :D
 
chạy code mới nó báo lỗi như này bác ơi. giúp em với
Tôi đã bảo bạn là thay code cũ bằng code mới cơ mà bạn lại thay mới và xóa đi hàm SoNgauNghien thì làm sao mà chả lỗi cho được.
Thêm 1 module nữa và paste hàm này vào.
Mã:
Function SoNgauNghien(iMin As Long, iMax As Long)
    Randomize
    SoNgauNghien = Int((iMax - iMin) * Rnd + iMin)
End Function
Chạy thử.
 
Mình đang gặp vấn đề khó khăn. Xin nhờ mọi người giúp đỡ ạ.
Vấn đề của mình như sau:
Mình có 1 bảng ghi giá của từng sản phẩm.
Giờ cho trước một số tiền, và cho trước số lượng mã hàng cần mua. Việc của mình là phải làm sao tìm được các mã hàng đó tương ứng là khối lượng của các mã hàng ( khối lượng các mã hàng thì không nên bằng nhau nhưng cũng không nên chênh lệch quá lớn), làm sao cho tổng tiền sẽ bằng hoặc nhỏ hơn gần nhất với số tiền cho trước.
Có thể tạo cột phụ thoải mái, Nếu có thể thì dùng công thức còn nếu không thì cũng có thể dùng VBA.
Mình có đính kèm file.
Rất mong được mọi người giúp đỡ!
Mình có file này bạn xem thử nhé. Mình cũng không giỏi excel lắm, nên đa số dùng công thức thôi.
 

File đính kèm

Tôi đã bảo bạn là thay code cũ bằng code mới cơ mà bạn lại thay mới và xóa đi hàm SoNgauNghien thì làm sao mà chả lỗi cho được.
Thêm 1 module nữa và paste hàm này vào.
Mã:
Function SoNgauNghien(iMin As Long, iMax As Long)
    Randomize
    SoNgauNghien = Int((iMax - iMin) * Rnd + iMin)
End Function
Chạy thử.
Chào bạn! Lâu rồi mới vào lại thấy bạn vẫn tích cực, rất vui.
 
Trong gpe bạn thực sự rất tâm huyết.
Dạo này anh ấy cũng đỡ vất vả rồi, gần đây có bài nào xuất hiện là có một số thành viên vận dụng AI giải đáp luôn trong thời gian rất ngắn, nên phần nào những bạn nhờ hỗ trợ cũng tiết kiệm được kha khá thời gian anh ạ.
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom