Найти комбинацию чисел, сумма которых окажется максимально близкой к заданному числу - VB

Узнай цену своей работы

Формулировка задачи:

Помогите решить задачу. Дан ряд положительных чисел (пусть их сумма обозначается буквой P), и определённое значение (назовём N), которое несколько меньше суммы этих чисел (N<P). Нужно найти такие числа из ряда, которые дадут МАКСИМАЛЬНУЮ сумму, приближающуюся к N, но не превышают N (<=N). (Например, дан ряд чисел: 23, 35, 45, 21, 89, 73, 54, 49, 38, 18, 44, 63, сумма которых равна 552. И задано число 450. Нужно из заданного ряда выбрать те из чисел, сумма которых не превысит число 450, но при этом будет самой максимальной из всех возможных). Решение задачи необходимо для реализации на практике.

Решение задачи: «Найти комбинацию чисел, сумма которых окажется максимально близкой к заданному числу»

textual
Листинг программы
  1. Sub Greedy(X() As Integer, S As Integer)
  2.       '::: Сортируем массив
  3.      n% = UBound(X, 1)
  4.       For i% = 1 To n% - 1
  5.           For j% = i% + 1 To n%
  6.                If X(i%) > X(j%) Then
  7.                   tmp% = X(i%)
  8.                   X(i%) = X(j%)
  9.                   X(j%) = tmp%
  10.                End If
  11.           Next j%
  12.       Next i%
  13.       '::: Cумма
  14.      Q% = 0
  15.       For i% = 1 To n%
  16.           Q% = Q% + X(i%)
  17.       Next i%
  18.       '::: Первоначальный отбор
  19.      For i% = 1 To n%
  20.            Q% = Q% - X(i%)
  21.            X(i%) = -X(i%)
  22.            If Q% <= S Then Exit For
  23.       Next i%
  24.       '::: Если текущая сумма меньше нужной...
  25.      '::: Пробуем добавить ранее отброшенные
  26.      If Q% < S Then
  27.          For i% = n% To 1 Step -1
  28.              If X(i%) < 0 Then
  29.                 If Q% + Abs(X(i%)) <= S Then
  30.                    X(i%) = Abs(X(i%))
  31.                    Q% = Q% + X(i%)
  32.                 End If
  33.                    
  34.              End If
  35.          Next i%
  36.       End If
  37.       '::: Печать
  38.      Z% = 0
  39.       For i% = 1 To n%
  40.            If X(i%) > 0 Then
  41.               Debug.Print X(i%)
  42.               Z% = Z% + X(i%)
  43.            End If
  44.       Next i%
  45.       Debug.Print "Сумма="; Z%
  46. End Sub
  47.  
  48. Sub Test()
  49.  
  50. Dim X(1 To 11) As Integer
  51.  
  52. X(1) = 23
  53. X(2) = 35
  54. X(3) = 45
  55. X(4) = 21
  56. X(5) = 89
  57. X(6) = 73
  58. X(7) = 54
  59. X(8) = 49
  60. X(9) = 38
  61. X(9) = 18
  62. X(10) = 44
  63. X(11) = 63
  64.  
  65.    Greedy X(), 450
  66.  
  67. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы