Xin giúp đỡ về hàm thống kê (1 người xem)

Liên hệ QC

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

nguyenhongphuong0204

Thành viên mới
Tham gia
21/1/20
Bài viết
22
Được thích
1
Mình có một hàm
TU = 275m + 75n + 157g + 163h + 126j - 684
Tìm m,n,g,h,j để TU -> min và TU > 0
Các biến là số nguyên, tìm TU

Mình loay hoay 2 ngày nay vẫn chưa tìm ra được cách. :(((
 
Bạn có thể cho OT tham khảo Code này được không? OT thấy kiểu này chắc chỉ có For và For ... T_T
OT cũng chưa hiểu "TU -> min" là như thế nào ạ?
Thì tất cả đều là số nguyên, tìm min, min >0 => đoán là TU=1 =>275m + 75n + 157g + 163h + 126j =685.
Bài này chạy solver là ra đâu cần code gì đâu bạn.
Có cái là đoán vậy trúng hay trật cũng chưa biết chừng
 
Cái này "solver" là sao vậy Bạn?
Bài này tương tự bài 13 của đường dẫn dưới đây.
 
Bài này tương tự bài 13 của đường dẫn dưới đây.
Cảm ơn Bạn đã chỉ dẫn, OT đang thử kiểu này thì bị treo máy ... hí hí hí (cứ tưởng ngon ăn)
Mã:
Sub For_Va_For()
    Dim TU As Long, m As Integer, n As Integer, g As Integer, h As Integer, j As Integer
    For m = 0 To 9: For n = 0 To 9: For g = 0 To 9: For h = 0 To 9: For j = 0 To 9
        TU = CLng(275 & m) + CLng(75 & n) + CLng(157 & g) + CLng(163 & h) + CLng(126 & j) - 684
'        If TU > 0 And ... Then
            Debug.Print TU & ";" & m & ";" & n & ";" & g & ";" & h & ";" & j
'        End If
    Next j: Next h: Next g: Next n: Next m
End Sub

Lót dép để "hóng" ạ :D
 
Cảm ơn Bạn đã chỉ dẫn, OT đang thử kiểu này thì bị treo máy ... hí hí hí (cứ tưởng ngon ăn)
Mã:
Sub For_Va_For()
    Dim TU As Long, m As Integer, n As Integer, g As Integer, h As Integer, j As Integer
    For m = 0 To 9: For n = 0 To 9: For g = 0 To 9: For h = 0 To 9: For j = 0 To 9
        TU = CLng(275 & m) + CLng(75 & n) + CLng(157 & g) + CLng(163 & h) + CLng(126 & j) - 684
'        If TU > 0 And ... Then
            Debug.Print TU & ";" & m & ";" & n & ";" & g & ";" & h & ";" & j
'        End If
    Next j: Next h: Next g: Next n: Next m
End Sub

Lót dép để "hóng" ạ :D
Bài này mà m, n, g, h, j nguyên dương thì for for cũng được bạn.
Có cái là chẳng biết âm dương thế nào nên để xem vậy.
 
Bài này mà m, n, g, h, j nguyên dương thì for for cũng được bạn.
Có cái là chẳng biết âm dương thế nào nên để xem vậy.
Chạy không treo, quay quay một lúc nhưng cũng không thấy gì luôn Bạn ạ, :D
Mã:
Option Explicit
Sub For_Va_For()
    Dim TU As Long, m As Integer, n As Integer, g As Integer, h As Integer, j As Integer
    For m = 0 To 9: For n = 0 To 9: For g = 0 To 9: For h = 0 To 9: For j = 0 To 9: For TU = 0 To 9
        If TU = CLng(275 & m) + CLng(75 & n) + CLng(157 & g) + CLng(163 & h) + CLng(126 & j) - 684 Then _
        Debug.Print TU & ";" & m & ";" & n & ";" & g & ";" & h & ";" & j
    Next TU: Next j: Next h: Next g: Next n: Next m
End Sub
 
Bài này tương tự bài 13 của đường dẫn dưới đây.
Chào bạn. Mình cám ơn bạn rất nhiều. Mình có xem nãy giờ bài #13 nhưng vẫn chưa hiểu là slover như thế nào. Bạn giúp mình theo file được không? 2 ngày nay mình cày nát cái Google mà vẫn không biết làm sao ra được phương án tối ưu
Bài đã được tự động gộp:

À TU > 0 thôi. Chứ k cần nguyên. Mấy ông biến thì là số nguyên
 
Bạn thử code sau
Mã:
Sub a()
    Dim m, n, g, h, j
    For m = 0 To 685 \ 275
    For n = 0 To 685 \ 75
    For g = 0 To 685 \ 157
    For h = 0 To 685 \ 163
    For j = 0 To 685 \ 126
        If 275 * m + 75 * n + 157 * g + 163 * h + 126 * j = 685 Then Debug.Print m, n, g, h, j
    Next: Next: Next: Next: Next
End Sub
Ở đây các số m,n,g,h,j là số tự nhiên nhưng vì ra kết quả =1 nhỏ nhất rồi nên không tìm số âm nữa
 
Chào bạn. Mình cám ơn bạn rất nhiều. Mình có xem nãy giờ bài #13 nhưng vẫn chưa hiểu là slover như thế nào. Bạn giúp mình theo file được không? 2 ngày nay mình cày nát cái Google mà vẫn không biết làm sao ra được phương án tối ưu
Bài đã được tự động gộp:

À TU > 0 thôi. Chứ k cần nguyên. Mấy ông biến thì là số nguyên
Bạn làm thử theo file bên dưới
 

File đính kèm

Bạn thử code sau
Mã:
Sub a()
    Dim m, n, g, h, j
    For m = 0 To 685 \ 275
    For n = 0 To 685 \ 75
    For g = 0 To 685 \ 157
    For h = 0 To 685 \ 163
    For j = 0 To 685 \ 126
        If 275 * m + 75 * n + 157 * g + 163 * h + 126 * j = 685 Then Debug.Print m, n, g, h, j
    Next: Next: Next: Next: Next
End Sub
Ở đây các số m,n,g,h,j là số tự nhiên nhưng vì ra kết quả =1 nhỏ nhất rồi nên không tìm số âm nữa
Trời ơi hóa phép nhân hả :D. chết mất thôi. khà khà khà. Chữ Thầy trả Cô hết rồi
Cảm ơn Hau151978
Bài đã được tự động gộp:

Hay quá code đã chạy rẹt trong chớp mắt , nhưng OT chưa hiểu con số 685 ở đâu để đưa vào sẵn vậy ạ?
Phiền Bạn Hau151978 giải thích thêm được không ạ? Hic hic vi diệu thật.

Mã:
Option Explicit
Sub For_Va_For()
    Dim TU As Long, m As Integer, n As Integer, g As Integer, h As Integer, j As Integer
    For m = 0 To 9: For n = 0 To 9: For g = 0 To 9: For h = 0 To 9: For j = 0 To 9: For TU = 0 To 9
        If TU = 275 * m + 75 * n + 157 * g + 163 * h + 126 * j - 684 Then _
        Debug.Print TU & "=" & m & ";" & n & ";" & g & ";" & h & ";" & j
    Next TU: Next j: Next h: Next g: Next n: Next m
End Sub
'==============='
'Kết quả:
'8=0;0;2;0;3
'6=0;1;0;3;1
'0=0;1;1;2;1
'7=0;2;0;1;3
'1=0;2;1;0;3<-------Làm sao để xác định được hàng này
'5=0;5;2;0;0
'4=0;7;0;1;0
'6=1;0;0;1;2
'0=1;0;1;0;2
 
Lần chỉnh sửa cuối:
Tìm tất cả trường hợp thỏa điều kiện
Mã:
Sub ABC()
  Dim iMin&, m&, n&, g&, h&, j&, tmp&, Tong&, d&
 
  tmp = 684
  iMin = 10000000
  For m = 0 To tmp \ 275 + 1
    For n = 0 To tmp \ 75 + 1
      For g = 0 To tmp \ 157 + 1
        For h = 0 To tmp \ 163 + 1
          For j = 0 To tmp \ 126 + 1
            Tong = m * 275 + n * 75 + g * 157 + h * 163 + j * 126
            If Tong > tmp Then
              d = Tong - tmp
              If d < iMin Then
                ReDim Res(1 To 1000, 1 To 6)
                iMin = d: k = 1
                Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
                Res(k, 4) = h: Res(k, 5) = j
              ElseIf d = iMin Then
                k = k + 1
                Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
                Res(k, 4) = h: Res(k, 5) = j
              End If
              Exit For
            End If
          Next j
        Next h
      Next g
    Next n
  Next m
  Range("A3:F3").Resize(k) = Res
End Sub
 
Tìm tất cả trường hợp thỏa điều kiện
Mã:
Sub ABC()
  Dim iMin&, m&, n&, g&, h&, j&, tmp&, Tong&, d&

  tmp = 684
  iMin = 10000000
  For m = 0 To tmp \ 275 + 1
    For n = 0 To tmp \ 75 + 1
      For g = 0 To tmp \ 157 + 1
        For h = 0 To tmp \ 163 + 1
          For j = 0 To tmp \ 126 + 1
            Tong = m * 275 + n * 75 + g * 157 + h * 163 + j * 126
            If Tong > tmp Then
              d = Tong - tmp
              If d < iMin Then
                ReDim Res(1 To 1000, 1 To 6)
                iMin = d: k = 1
                Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
                Res(k, 4) = h: Res(k, 5) = j
              ElseIf d = iMin Then
                k = k + 1
                Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
                Res(k, 4) = h: Res(k, 5) = j
              End If
              Exit For
            End If
          Next j
        Next h
      Next g
    Next n
  Next m
  Range("A3:F3").Resize(k) = Res
End Sub
Khuya lắm rồi ngủ thôi Bác ơi, mấy đêm nay đầu óc con toàn ngủ mơ thấy code thôi. :D
Kakaka, ngày mai Bác cháu ta lại tiếp tục chương trình hỏi đáp ạ.
Bác giữ gìn sức khỏe Bác nhé.
Con chúc Bác ngủ ngon.
Oanh Thơ
 
Khi a, b là 2 số nguyên dương nguyên tố cùng nhau (tức là ước số chung lớn nhất =1) thì luôn tồn tại cặp số nguyên x, y để a*x+b*y=1
Điều này chứng minh khá dễ (kiến thức lớp 6 của học sinh >= khá) và dựa vào đó có thể xây dựng thuật toán tìm x y.
Trong các hệ số trên thì 75 và 157 nguyên tố cùng nhau nên chỉ cần tìm x, y để 75x+157y=1, nhân các số x y này với 685 thì được 75n+157j=685, các số còn lại =0.
 
Khi a, b là 2 số nguyên dương nguyên tố cùng nhau (tức là ước số chung lớn nhất =1) thì luôn tồn tại cặp số nguyên x, y để a*x+b*y=1
Điều này chứng minh khá dễ (kiến thức lớp 6 của học sinh >= khá) và dựa vào đó có thể xây dựng thuật toán tìm x y.
Trong các hệ số trên thì 75 và 157 nguyên tố cùng nhau nên chỉ cần tìm x, y để 75x+157y=1, nhân các số x y này với 685 thì được 75n+157j=685, các số còn lại =0.

Dạ. Hôm qua em có làm theo cách solver, kết quả em ra giống anh @CHAOQUAY ở bài #2. Em làm theo hướng là TU>0, em tìm thử với TU min=1. Em chạy solver để tìm các biến m, n, g, h, j (các biến là số nguyên). Nhưng em cứ vướng một vấn đề là: Em thử với TU=1. Nhưng yêu cầu đề ra không yêu cầu TU phải là số nguyên, nên em thắc mắc có trường hợp nào xảy ra thỏa các biến nguyên (có thể âm hoặc dương) mà 0<TU<1 không ạ? (Có khi nào TU=1 chưa phải nhỏ nhất không ạ? Anh hướng dẫn em với ạ. Em cảm ơn anh ạ.
 
Các phép tính cộng và nhân trên số nguyên thì phải ra số nguyên chứ bạn ơi. Mình nghĩ tác giả có sự nhầm lẫn giữa số nguyên và số tự nhiên. Số tự nhiên là 0, 1, 2...
Sô nguyên thì thêm các số âm -1, -2... nữa
 
Các phép tính cộng và nhân trên số nguyên thì phải ra số nguyên chứ bạn ơi. Mình nghĩ tác giả có sự nhầm lẫn giữa số nguyên và số tự nhiên. Số tự nhiên là 0, 1, 2...
Sô nguyên thì thêm các số âm -1, -2... nữa

Dạ, em hiểu rồi ạ. Em cảm ơn anh nhiều ạ.
 
Dạ. Hôm qua em có làm theo cách solver, kết quả em ra giống anh @CHAOQUAY ở bài #2. Em làm theo hướng là TU>0, em tìm thử với TU min=1. Em chạy solver để tìm các biến m, n, g, h, j (các biến là số nguyên). Nhưng em cứ vướng một vấn đề là: Em thử với TU=1. Nhưng yêu cầu đề ra không yêu cầu TU phải là số nguyên, nên em thắc mắc có trường hợp nào xảy ra thỏa các biến nguyên (có thể âm hoặc dương) mà 0<TU<1 không ạ? (Có khi nào TU=1 chưa phải nhỏ nhất không ạ? Anh hướng dẫn em với ạ. Em cảm ơn anh ạ.
Tất cả các tham số tính TU đều là nguyên thì kết quả phải là nguyên thôi bạn.
Có điều là từ đầu bạn không nói rõ là nguyên nhưng không giới hạn âm hay dương nên các code trên trả lời thiếu đáp án.
 
Tất cả các tham số tính TU đều là nguyên thì kết quả phải là nguyên thôi bạn.
Có điều là từ đầu bạn không nói rõ là nguyên nhưng không giới hạn âm hay dương nên các code trên trả lời thiếu đáp án.

Dạ, em cảm ơn anh ạ. Em chạy solver kết quả ra các biến đều theo bài #2 (nguyên dương), bài #16 em thấy anh ra cả nguyên âm. Anh chạy solver ra ạ?
 
Liệt kê kết quả giới hạn từ -10 tới 10, tối đa 1000 dòng kết quả nếu vượt sẽ báo lỗi
Mã:
Sub XYZ()
  Dim Res(), k&, dMin&
  Dim m&, n&, g&, h&, j&, T1&, T2&, T3&, T4&, T5&
  Const Y# = 684
  Const xLow& = -10
  Const xUp& = 10

  dMin = 10000000
  For m = xLow To xUp
    T1 = m * 275 - Y
    If T1 > 0 Then Call AddRes(Res, k, dMin, T1, m): Exit For
    For n = xLow To xUp
      T2 = T1 + n * 75
      If T2 > 0 Then Call AddRes(Res, k, dMin, T2, m, n): Exit For
      For g = xLow To xUp
        T3 = T2 + g * 157
        If T3 > 0 Then Call AddRes(Res, k, dMin, T3, m, n, g): Exit For
        For h = xLow To xUp
          T4 = T3 + h * 163
          If T4 > 0 Then Call AddRes(Res, k, dMin, T4, m, n, g, h): Exit For
          For j = xLow To xUp
            T5 = T4 + j * 126
            If T5 > 0 Then Call AddRes(Res, k, dMin, T5, m, n, g, h, j): Exit For
          Next j
        Next h
      Next g
    Next n
  Next m
  Range("A3:E3").Resize(k) = Res
End Sub

Private Sub AddRes(Res, k, dMin, ByVal d&, ByVal m&, Optional ByVal n& = 0, _
            Optional ByVal g& = 0, Optional ByVal h& = 0, Optional ByVal j& = 0)
    If d < dMin Then
      ReDim Res(1 To 1000, 1 To 6)
      dMin = d: k = 1
      Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
      Res(k, 4) = h: Res(k, 5) = j ': Res(k, 6) = d
    ElseIf d = dMin Then
      k = k + 1
      Res(k, 1) = m: Res(k, 2) = n: Res(k, 3) = g
      Res(k, 4) = h: Res(k, 5) = j ': Res(k, 6) = d
    End If
End Sub
 
Code đơn giản sau sẽ giải được phương trình ax+by=1, trong đó a, b là 2 số tự nhiên nguyên tố cùng nhau (ở đây mình chọn a=75, b=157). Chứng minh thuật toán đúng cũng không khó, chỉ cần kiến thức số học lớp 6.
Mã:
Option Explicit
Sub test()
    Dim a&, b&, x&, y&, i&, n&, arr()
    a = 75
    b = 157
    Do While a > 1 And b > 1
        n = n + 1
        ReDim Preserve arr(1 To n)
        If a > b Then
            a = a - b
            arr(n) = 1
        Else
            b = b - a
            arr(n) = 0
        End If
    Loop
    If a = 1 Then
        x = 1
        y = 0
    Else
        x = 0
        y = 1
    End If
    For i = n To 1 Step -1
        If arr(i) = 0 Then x = x - y Else y = y - x
    Next
    Debug.Print x
    Debug.Print y
End Sub
Chạy thử ta được x=67, y=-32. Từ đó phương trình 275 * m + 75 * n + 157 * g + 163 * h + 126 * j - 684=1 sẽ có vô số nghiệm là m=0, n=67*685, g=-32*685, h=126*k, j=-163*k (k là các số nguyên).
 
chắc muốn chứng minh là đã học hết lớp 6 đây mà, khổ vậy
 
Mình không thể hiện gì mấy bài này. Do có bạn nhắn tin hỏi nên mình trả lời luôn. Gõ code nhanh hơn là lý giải.
 
Các phép tính cộng và nhân trên số nguyên thì phải ra số nguyên chứ bạn ơi. Mình nghĩ tác giả có sự nhầm lẫn giữa số nguyên và số tự nhiên. Số tự nhiên là 0, 1, 2...
Sô nguyên thì thêm các số âm -1, -2... nữa
Thớt không có căn bản về toán số. Bài này lại gọi là "thống kê"
Ở bài #10, thớt nói "TU > 0 thôi. Chứ k cần nguyên [sic]". Nếu tôi tạm hiểu k là từ "không" thì điều kiện này hoàn toàn không cần. Các thừa số đều là nguyên thì giá trị biểu thức đương nhiên phải nguyên.

Chú về lập trình:
Theo toán số thì bài này ai lại đặt m,n, rồi còn nhảy g,h,j nữa. Chả có một trật tự gì cả.
Đặt tên theo lập trình thì phải là
Dim a As Variant
Dim k(0 To 5) As Long ' k(0) luôn luôn là 1
a = Array( -684, 126, 163, 157, 75, 275 )
 

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

Back
Top Bottom