Выбрать максимальное количество чисел, сумма которых не превышает 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д