Выбрать максимальное количество чисел, сумма которых не превышает P - VBA
Формулировка задачи:
Дан набор натуральных чисел и число P. Выбрать максимальное количество
чисел, сумма которых не превышает P
Р - это не пи, а просто любое число
Размерности массивов вводить с клавиатуры. Элементы массивов по желанию
пользователя вводить с клавиатуры или генерировать случайным образом в заданных
пределах. Исходные данные и результаты выводить на экран дисплея в табличном виде.
Должна быть форма, с кнопочками и прочим.
Ломаем голову уже 3тий день с одногрупником, никто не может помочь...
Решение задачи: «Выбрать максимальное количество чисел, сумма которых не превышает P»
textual
Листинг программы
Option Explicit
Option Base 1
Const MaxNum = 100
Private Sub CommandButton4_Click()
Dim s$, ss$(), i&
Debug.Print Controls("TextBox1").Text
For i = 1 To 4
s = s & vbLf & Controls("Label" & i).Caption & vbTab & _
Controls("TextBox" & i).Text
Next
s = Replace(s, "введите", "", , , 1)
ss = Split(Mid$(s, 2), vbLf)
For i = 0 To UBound(ss)
ss(i) = Trim$(ss(i))
Mid(ss(i), 1, 1) = UCase(Mid(ss(i), 1, 1))
Next
s = Join(ss, vbLf)
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText s: .PutInClipboard
On Error Resume Next
[a6].Select
ActiveSheet.Paste
End With
End Sub
Private Sub CommandButton3_Click()
Dim s$, ss$(), ll&(), i&, j&, v
s = Replace(TextBox1.Text, " ", ""): ss = Split(s, ",")
For i = 0 To UBound(ss)
If IsNumeric(ss(i)) Then _
j = j + 1: ReDim Preserve ll(j): ll(j) = ss(i)
Next
q ll, 1, j
j = 0: s = ""
For i = 1 To UBound(ll)
j = j + ll(i)
If j < Val(TextBox2.Text) Then
s = s & " + " & ll(i): v = j
Else: Exit For
End If
Next
TextBox3.Text = UBound(Split(s, " + "))
TextBox4.Text = Mid$(s, 4) & " = " & v
End Sub
Private Sub q(l&(), ll&, hh&)
Dim i&, ii&, s&, w&
i = ll: ii = hh: s = l((i + ii) \ 2)
Do Until i > ii: Do While l(i) < s: i = i + 1: Loop: Do While l(ii) > s: ii = ii - 1: Loop
If (i <= ii) Then w = l(i): l(i) = l(ii): l(ii) = w: i = i + 1: ii = ii - 1
Loop
If ll < ii Then q l, ll, ii
If i < hh Then q l, i, hh
End Sub
Private Sub CommandButton1_Click()
Dim r, ss$(), i&
Do
r = InputBox("Размер массива ?", , 10)
Loop Until IsNumeric(r)
ReDim ss(r)
Randomize Timer
For i = 1 To r
ss(i) = Fix(Rnd * MaxNum)
Next
TextBox1.Text = Join(ss, ", ")
End Sub
Private Sub CommandButton2_Click()
Randomize Timer
TextBox2.Text = MaxNum
End Sub
Private Sub TextBox1_Change()
Dim b As Boolean
On Error Resume Next
b = IsNumeric(Split(TextBox1.Text)(0))
b = b And IsNumeric(TextBox2.Text)
CommandButton3.Enabled = b
End Sub
Private Sub TextBox3_Change()
Dim b As Boolean
On Error Resume Next
b = IsNumeric(Split(TextBox4.Text)(0))
b = b And IsNumeric(TextBox3.Text)
b = b And CommandButton3.Enabled
CommandButton4.Enabled = b
End Sub
Private Sub UserForm_Activate()
TextBox1_Change
TextBox3_Change
Me.Caption = "Выбрать максимальное количество чисел сумма которых не превышает P"
End Sub
Private Sub TextBox2_Change(): TextBox1_Change: End Sub
Private Sub TextBox4_Change(): TextBox3_Change: End Sub