CÔNG THỨC CHỌN RA 5 CON TRONG SỐ 10 CON VẬT

Liên hệ QC
@giaydabo
Bài này nếu dùng vba có thể tổng quát được số kết quả. Có điều bạn cần làm rõ là các tổ hợp giống nhau sẽ tính là 1 hay là khác
 
Thêm vào tổng từng nhóm:
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4})),
SUM(D4:H4),
SUM(I4:M4),
SUM(N4:R4)))
Thử vào bài toán gốc ra 14, kết quả đúng là 13:(
 
E đang cần ghép các nhóm sản phẩm khác nhau cho công ty. Tên sản phẩm thì em thay tên bằng con vật rùi đấy ạ.
Bài này có nhiều cách chọn - mỗi cách lại có số nhóm lặp (5) - không rõ bạn tìm cách nào? (tối ưu, hay 1 cách là được)
tham khảo ví dụ 8 ở link này, sẽ thấy gần giống có nhiều cách
https://toanmath.com/2018/06/phuong-phap-giai-bai-toan-dem.html
 
Chủ câu hỏi không thấy đâu nhỉ, nghe bài này giống bầu cua tôm cá, ai có thể khái quát bài toán ứng dụng để anh em biết cách ứng dụng được không?

Tôi biết các anh em thành viên GPE ở đây nhiệt tình, nhiều khi cứ làm nhưng không biết là dùng vào đâu? (bài này nghe giống bầu cua tôm cá nhưng lại khác)
Có bắt buộc phải biết dùng vào đâu hay không? Ghép nhóm sản phẩm (combo) để bán với 1 số điều kiện gì đó thì sao? Tôi lại phải xóa rồi nhé
 
Thử cái này:
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4}))))
Xem kĩ lại thì công thức của bạn xét trên cả vùng, chứ không xét trên từng nhóm nên chưa thể đúng được, bạn kiểm tra lại trường hợp này xem kết quả đúng chỉ có 2 cặp.
1548952827561.png
 
Gửi file thêm 1 phương án cho chủ topic chọn
Ghi chú kỹ trong file, nếu không hiểu phần nào cứ hỏi nhé
File cho phép lựa chọn các phương án khác nhau, để tự tìm ra số cặp lớn mong muốn

(chính làm xong xem lại, tôi cũng không rõ đã quét đủ phương án chưa, nên chỉ là 1 phương án mọi người tham khảo)
 

File đính kèm

  • file làm công thức (1) (2).xlsx
    18 KB · Đọc: 17
E đang cần ghép các nhóm sản phẩm khác nhau cho công ty. Tên sản phẩm thì em thay tên bằng con vật rùi đấy ạ.
Tạo code cho bạn
Xem kĩ lại thì công thức của bạn xét trên cả vùng, chứ không xét trên từng nhóm nên chưa thể đúng được, bạn kiểm tra lại trường hợp này xem kết quả đúng chỉ có 2 cặp.
View attachment 211885
Công thức của bạn Phuocam đã xét toàn bộ các khả năng, bạn muốn kiểm tra thì dùng code của mình chạy ngẫu nhiên vài ngàn tình huống
Mã:
Sub Main()
  Dim i As Long
  Application.ScreenUpdating = False
  For i = 1 To 1
    Call RandomVal
    Call PhanBo
    If [s4].Value <> [s7].Value Then Exit For
  Next i
  Application.ScreenUpdating = True
End Sub

Private Sub RandomVal()
  Dim Res(), j As Long, Num As Long
  Const N As Long = 15
 
  On Error Resume Next
  Num = Range("S1").Value
  If Num = 0 Then Range("S1") = 10: Num = 10    'Mac dinh Num = 10
  Num = Num + 1
  ReDim Res(1 To 1, 1 To N)
  Randomize
  For j = 1 To N
    Res(1, j) = Int(Rnd * Num)
  Next j
  Range("D4:R4") = Res
End Sub

Sub PhanBo()
  Dim Res(), tmp(), Tong(), S, TongStr As String
  Dim sCol As Long, j As Long, jk As Long, jMax As Long, jCol As Long
  Dim i As Long, k As Long, p As Long
  Const N As Byte = 5
  Const Nhom As Byte = 3
  Const sNhom As Byte = 5
 
  ReDim tmp(1 To N)
  ReDim Tong(1 To 2, 1 To Nhom)
  Range("D5:R1003").ClearContents
  Res = Range("D4:R1003").Value
  sCol = UBound(Res, 2)
    
  For m = 1 To Nhom
    For j = 1 To sNhom
      jk = (m - 1) * sNhom + j
      Tong(1, m) = Tong(1, m) + Res(1, jk)
    Next j
  Next m
    
  i = 1: k = 5
  Do While k = 5
    i = i + 1: k = 0
    For m = 1 To Nhom
      jMax = -1: jCol = 0
      For j = 1 To sNhom
        jk = (m - 1) * sNhom + j
        If Res(i, jk) = Empty And Res(1, jk) > 0 Then
          If Res(1, jk) > jMax Then jMax = Res(1, jk): jCol = jk
        End If
      Next j
      If jCol > 0 Then
        k = k + 1
        tmp(k) = jCol
        Res(i, jCol) = 1
        Tong(1, m) = Tong(1, m) - 1
        Tong(2, m) = Tong(1, m) - Res(1, jCol) + 1
      End If
    Next m
    For q = Nhom + 1 To N
      jMax = -1: TongStr = ""
      For j = 1 To Nhom
        If Tong(2, j) > jMax Then
          jMax = Tong(2, j): m = j: TongStr = "," & j
        ElseIf Tong(2, j) = jMax Then
          TongStr = TongStr & "," & j
        End If
      Next j
      jMax = -1: jCol = 0
      S = Split(TongStr, ",")
      For p = 1 To UBound(S)
        m = CLng(S(p))
        For j = 1 To sNhom
          jk = (m - 1) * sNhom + j
          If Res(i, jk) = Empty And Res(1, jk) > 0 Then
            If Res(1, jk) > jMax Then jMax = Res(1, jk): jCol = jk
          End If
        Next j
      Next p
      If jCol > 0 Then
        m = Int((jCol - 1) / 5) + 1
        k = k + 1
        tmp(k) = jCol
        Res(i, jCol) = 1
        Tong(1, m) = Tong(1, m) - 1
        Tong(2, m) = Tong(2, m) - 1
      End If
    Next q
    If k = 5 Then
      For j = 1 To N
        jCol = tmp(j)
        Res(1, jCol) = Res(1, jCol) - 1
      Next j
    Else
      Range("D7:R47").Resize(i - 1) = Res
      Range("S7") = i - 2
      Exit Sub
    End If
  Loop
End Sub
 

File đính kèm

  • file làm công thức (1).xlsm
    29.7 KB · Đọc: 25
Tạo code cho bạn

Công thức của bạn Phuocam đã xét toàn bộ các khả năng, bạn muốn kiểm tra thì dùng code của mình chạy ngẫu nhiên vài ngàn tình huống
Mã:
Sub Main()
  Dim i As Long
  Application.ScreenUpdating = False
  For i = 1 To 1
    Call RandomVal
    Call PhanBo
    If [s4].Value <> [s7].Value Then Exit For
  Next i
  Application.ScreenUpdating = True
End Sub

Private Sub RandomVal()
  Dim Res(), j As Long, Num As Long
  Const N As Long = 15

  On Error Resume Next
  Num = Range("S1").Value
  If Num = 0 Then Range("S1") = 10: Num = 10    'Mac dinh Num = 10
  Num = Num + 1
  ReDim Res(1 To 1, 1 To N)
  Randomize
  For j = 1 To N
    Res(1, j) = Int(Rnd * Num)
  Next j
  Range("D4:R4") = Res
End Sub

Sub PhanBo()
  Dim Res(), tmp(), Tong(), S, TongStr As String
  Dim sCol As Long, j As Long, jk As Long, jMax As Long, jCol As Long
  Dim i As Long, k As Long, p As Long
  Const N As Byte = 5
  Const Nhom As Byte = 3
  Const sNhom As Byte = 5

  ReDim tmp(1 To N)
  ReDim Tong(1 To 2, 1 To Nhom)
  Range("D5:R1003").ClearContents
  Res = Range("D4:R1003").Value
  sCol = UBound(Res, 2)
   
  For m = 1 To Nhom
    For j = 1 To sNhom
      jk = (m - 1) * sNhom + j
      Tong(1, m) = Tong(1, m) + Res(1, jk)
    Next j
  Next m
   
  i = 1: k = 5
  Do While k = 5
    i = i + 1: k = 0
    For m = 1 To Nhom
      jMax = -1: jCol = 0
      For j = 1 To sNhom
        jk = (m - 1) * sNhom + j
        If Res(i, jk) = Empty And Res(1, jk) > 0 Then
          If Res(1, jk) > jMax Then jMax = Res(1, jk): jCol = jk
        End If
      Next j
      If jCol > 0 Then
        k = k + 1
        tmp(k) = jCol
        Res(i, jCol) = 1
        Tong(1, m) = Tong(1, m) - 1
        Tong(2, m) = Tong(1, m) - Res(1, jCol) + 1
      End If
    Next m
    For q = Nhom + 1 To N
      jMax = -1: TongStr = ""
      For j = 1 To Nhom
        If Tong(2, j) > jMax Then
          jMax = Tong(2, j): m = j: TongStr = "," & j
        ElseIf Tong(2, j) = jMax Then
          TongStr = TongStr & "," & j
        End If
      Next j
      jMax = -1: jCol = 0
      S = Split(TongStr, ",")
      For p = 1 To UBound(S)
        m = CLng(S(p))
        For j = 1 To sNhom
          jk = (m - 1) * sNhom + j
          If Res(i, jk) = Empty And Res(1, jk) > 0 Then
            If Res(1, jk) > jMax Then jMax = Res(1, jk): jCol = jk
          End If
        Next j
      Next p
      If jCol > 0 Then
        m = Int((jCol - 1) / 5) + 1
        k = k + 1
        tmp(k) = jCol
        Res(i, jCol) = 1
        Tong(1, m) = Tong(1, m) - 1
        Tong(2, m) = Tong(2, m) - 1
      End If
    Next q
    If k = 5 Then
      For j = 1 To N
        jCol = tmp(j)
        Res(1, jCol) = Res(1, jCol) - 1
      Next j
    Else
      Range("D7:R47").Resize(i - 1) = Res
      Range("S7") = i - 2
      Exit Sub
    End If
  Loop
End Sub
Code rất hay, tạo ngẫu nhiên nhiều trường hợp,
Nhưng có thể chúng ta có cách quét hết các trường hợp không bác?
 
Code rất hay, tạo ngẫu nhiên nhiều trường hợp,
Nhưng có thể chúng ta có cách quét hết các trường hợp không bác?
Code rất hay, tạo ngẫu nhiên nhiều trường hợp,
Nhưng có thể chúng ta có cách quét hết các trường hợp không bác?
Có thể, nhưng số khả năng lớn chạy sẽ tốn nhiều thời gian, không cần thiết
 
Không hiểu cái gì luôn, làm càn, hên xui: :p

=MIN(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4})),INT(SUM(D4:R4)/5))

nếu bỏ qua điều kiện mỗi nhóm có ít nhất 1 con vật thì dùng cách này được đúng ko ạ?
Các bác test giúp em với ạ. E xin cảm ơn. Và nếu có thời gian các bác có thể giải thích giúp em về công thức được ko ạ? e ko hiểu thế mới buồn
 
nếu bỏ qua điều kiện mỗi nhóm có ít nhất 1 con vật thì dùng cách này được đúng ko ạ?
Các bác test giúp em với ạ. E xin cảm ơn. Và nếu có thời gian các bác có thể giải thích giúp em về công thức được ko ạ? e ko hiểu thế mới buồn
BÁC @HieuCD và bác @phuocam giải thích giùm em với. e trả biết chạy cod để thử? \e cảm ơn ạ
 
BÁC @HieuCD và bác @phuocam giải thích giùm em với. e trả biết chạy cod để thử? \e cảm ơn ạ
nếu bỏ qua điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #33
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4}))))
điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #36
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4})),
SUM(D4:H4),
SUM(I4:M4),
SUM(N4:R4)))
Số trường hợp lấy 5 con lý tưởng là SUM(D4:R4)/5
Nhưng có thể số con tập trung cho loại lớn nhất, loại lớn nhất lấy 1 con, tổng các loại còn lại có thể không đủ lấy 4 con nên xét các loại còn lại không tính loại lớn nhất (SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4
Tương tự loại lớn nhất lớn nhì lấy 2 con, tổng các loại còn lại có thể không đủ lấy 3 con: (SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3
...
 
nếu bỏ qua điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #33
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4}))))
điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #36
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4})),
SUM(D4:H4),
SUM(I4:M4),
SUM(N4:R4)))
Số trường hợp lấy 5 con lý tưởng là SUM(D4:R4)/5
Nhưng có thể số con tập trung cho loại lớn nhất, loại lớn nhất lấy 1 con, tổng các loại còn lại có thể không đủ lấy 4 con nên xét các loại còn lại không tính loại lớn nhất (SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4
Tương tự loại lớn nhất lớn nhì lấy 2 con, tổng các loại còn lại có thể không đủ lấy 3 con: (SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3
...
e cảm ơn bác ạ!
 
Có thể, nhưng số khả năng lớn chạy sẽ tốn nhiều thời gian, không cần thiết
Em không thể nhắn tin riêng cho bác. bác giúp em làm công thức trong file excel em gửi với ạ. Mong bác giúp đỡ. E cảm ơn ạ!
 

File đính kèm

  • Công thức tìm đơn hàng đầu tiên.xlsx
    9.1 KB · Đọc: 5
Em không thể nhắn tin riêng cho bác. bác giúp em làm công thức trong file excel em gửi với ạ. Mong bác giúp đỡ. E cảm ơn ạ!
Bạn tìm đầu tiền dùng Vlookup cho đơn giản (hình như Index + match cũng được thì phải - chưa dùng), thường dùng tìm dòng cuối là chính Lookup
Bài đã được tự động gộp:

nếu bỏ qua điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #33
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4}))))
điều kiện mỗi nhóm có ít nhất 1 con vật: Bài #36
Mã:
=INT(MIN(SUM(D4:R4)/5,
(SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3,
(SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3})))/2,
SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2,3,4})),
SUM(D4:H4),
SUM(I4:M4),
SUM(N4:R4)))
Số trường hợp lấy 5 con lý tưởng là SUM(D4:R4)/5
Nhưng có thể số con tập trung cho loại lớn nhất, loại lớn nhất lấy 1 con, tổng các loại còn lại có thể không đủ lấy 4 con nên xét các loại còn lại không tính loại lớn nhất (SUM(D4:R4)-SUM(LARGE(D4:R4,1)))/4
Tương tự loại lớn nhất lớn nhì lấy 2 con, tổng các loại còn lại có thể không đủ lấy 3 con: (SUM(D4:R4)-SUM(LARGE(D4:R4,{1,2})))/3
...
Môn xác suất hồi đi học ngu cả người ra, môn này khác nhiều người rớt. May mắn không có mình
 
Bạn tìm đầu tiền dùng Vlookup cho đơn giản (hình như Index + match cũng được thì phải - chưa dùng), thường dùng tìm dòng cuối là chính Lookup
Bài đã được tự động gộp:


Môn xác suất hồi đi học ngu cả người ra, môn này khác nhiều người rớt. May mắn không có mình
Môn nầy mình được học Thầy Nguyễn Tấn Lập giáo sư đại học ở Pháp theo lời kêu gọi của Bác Hồ về phục vụ tổ quốc, nghe nói Thầy 23 tuổi lấy tiến sĩ toán xác suất Pháp
 
Web KT
Back
Top Bottom