Tính số lượng dẫy số thỏa mãn tổng cho trước.

Liên hệ QC

constrexim7

Thành viên mới
Tham gia
20/8/07
Bài viết
7
Được thích
0
Nhờ Anh chị diễn đàn giúp em bài toán sau:
Có dẫy số 5 phần tử, mỗi phần tử là 1 dãy số tự nhiên cho trước giống nhau.
Câu hỏi là tính SỐ LƯỢNG các dẫy số có tổng bằng một số cho trước.
Chân thành cảm ơn anh chị!
 

File đính kèm

Học sinh làm bài tập hay kế toán làm phù phép hoá đơn đây?
 
Bài nầy làm đề thi toán quốc tế được đó
Em tưởng viết VBA là được nhỉ. Vì em không biết viết VBA nên đành phải nhờ cao thủ. Vấn đề là chỉ cần tổng Số lượng dãy số tỏa mãn thôi ạ. Passcal thi ngày xưa học quên hết rồi. Hu hu. Cao thủ nào giúp hộ em cái.
 
Nhờ Anh chị diễn đàn giúp em bài toán sau:
Có dẫy số 5 phần tử, mỗi phần tử là 1 dãy số tự nhiên cho trước giống nhau.
Câu hỏi là tính SỐ LƯỢNG các dẫy số có tổng bằng một số cho trước.
Chân thành cảm ơn anh chị!
Dùng hàm tự tạo, lưu ý tổ hợp lớn sẽ chạy chậm
=GPE(giá trị nhỏ nhất, giá trị lớn nhất, Số lượng số cộng, Tổng)
Mã:
Function GPE(ByVal xMin As Long, ByVal xMax As Long, ByVal k As Byte, ByVal Tong As Long)
  Dim Arr As Variant
  Dim N As Long, i As Long, j As Byte, tmp As Long, kq As Long
  N = xMax - xMin + 1
  Arr = Tohop(N, k)
  For i = LBound(Arr) To UBound(Arr)
    tmp = 0
    For j = 1 To N
      If Mid(Arr(i), j, 1) = "1" Then tmp = tmp + xMin + j - 1
    Next j
    If tmp = Tong Then kq = kq + 1
  Next i
  GPE = kq
End Function

Private Function Tohop(ByVal N As Integer, ByVal k As Integer) As Variant
  'tao to hop N chap k kha nang
  If N = k Then Tohop = Array(String(k, "1")): Exit Function
  Dim Arr As Variant, A As String, j As Long, p As Long, s As Long
  ReDim Arr(1 To Application.Combin(N, k))
  A = String(k, "1") & String(N - k, "0")
  p = 1:  Arr(p) = A
trolai:
  j = InStrRev(A, "1")
  Mid(A, j, 1) = "0"
  Mid(A, j + 1, s + 1) = String(s + 1, "1")
  s = 0:    p = p + 1:    Arr(p) = A
  If InStr(j + 1, A, "0") = 0 Then
    s = N - j
    If s = k Then Tohop = Arr: Exit Function
    Mid(A, j + 1, s) = String(s, "0")
  End If
  GoTo trolai
End Function
 

File đính kèm

Dùng hàm tự tạo, lưu ý tổ hợp lớn sẽ chạy chậm
=GPE(giá trị nhỏ nhất, giá trị lớn nhất, Số lượng số cộng, Tổng)
Mã:
Function GPE(ByVal xMin As Long, ByVal xMax As Long, ByVal k As Byte, ByVal Tong As Long)
  Dim Arr As Variant
  Dim N As Long, i As Long, j As Byte, tmp As Long, kq As Long
  N = xMax - xMin + 1
  Arr = Tohop(N, k)
  For i = LBound(Arr) To UBound(Arr)
    tmp = 0
    For j = 1 To N
      If Mid(Arr(i), j, 1) = "1" Then tmp = tmp + xMin + j - 1
    Next j
    If tmp = Tong Then kq = kq + 1
  Next i
  GPE = kq
End Function

Private Function Tohop(ByVal N As Integer, ByVal k As Integer) As Variant
  'tao to hop N chap k kha nang
  If N = k Then Tohop = Array(String(k, "1")): Exit Function
  Dim Arr As Variant, A As String, j As Long, p As Long, s As Long
  ReDim Arr(1 To Application.Combin(N, k))
  A = String(k, "1") & String(N - k, "0")
  p = 1:  Arr(p) = A
trolai:
  j = InStrRev(A, "1")
  Mid(A, j, 1) = "0"
  Mid(A, j + 1, s + 1) = String(s + 1, "1")
  s = 0:    p = p + 1:    Arr(p) = A
  If InStr(j + 1, A, "0") = 0 Then
    s = N - j
    If s = k Then Tohop = Arr: Exit Function
    Mid(A, j + 1, s) = String(s, "0")
  End If
  GoTo trolai
End Function
Cảm ơn @HieuCD ạ, quả thật tổ hợp lớn hơn 1 tý chạy chậm thật
Thanks a lot !
 
Mã:
...
trolai:
  j = InStrRev(A, "1")
  Mid(A, j, 1) = "0"
  Mid(A, j + 1, s + 1) = String(s + 1, "1")
  s = 0:    p = p + 1:    Arr(p) = A
  If InStr(j + 1, A, "0") = 0 Then
    s = N - j
    If s = k Then Tohop = Arr: Exit Function
    Mid(A, j + 1, s) = String(s, "0")
  End If
  GoTo trolai

Code goto "trở lại" thường được người ta thể hiện bằng vòng lặp

Do While True ' vòng lặp vô tận, ngừoi đọc tự biết bên trong có 1 lệnh exit
j = InStrRev(A, "1")
Mid(A, j, 1) = "0"
Mid(A, j + 1, s + 1) = String(s + 1, "1")
s = 0: p = p + 1: Arr(p) = A
If InStr(j + 1, A, "0") = 0 Then
s = N - j
If s = k Then Tohop = Arr: Exit Do
Mid(A, j + 1, s) = String(s, "0")
End If
Loop
 
Code goto "trở lại" thường được người ta thể hiện bằng vòng lặp

Do While True ' vòng lặp vô tận, ngừoi đọc tự biết bên trong có 1 lệnh exit
j = InStrRev(A, "1")
Mid(A, j, 1) = "0"
Mid(A, j + 1, s + 1) = String(s + 1, "1")
s = 0: p = p + 1: Arr(p) = A
If InStr(j + 1, A, "0") = 0 Then
s = N - j
If s = k Then Tohop = Arr: Exit Do
Mid(A, j + 1, s) = String(s, "0")
End If
Loop
Cám ơn bạn, lúc đầu mình xét điều kiện giá trị biến luôn đúng, nhưng thấy phải thêm một xử lý nên mới dùng Goto, không nghỉ ra lệnh "Do While True"
 
Web KT

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

Back
Top Bottom