Распределение камней - QBasic

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

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

Есть камни весом 1, 2, 3, 4, 5, 6, 7, 8, 9 целых единиц. Их нужно разложить по трем рюкзакам одинаково по весу, все рюкзаки должны иметь одинаковый вес. При этом, в 1м рюкзаке - 2 камня, во 2м - 3 камня, в 3м - 4 камня. Нужно определить, сколько существует таких вариантов разложения и перечислить их. Решение напрашивается только перебором.
Спойлер

Решение задачи: «Распределение камней»

textual
Листинг программы
  1. DECLARE FUNCTION MyNarayanaNextPerm(n AS LONG) AS LONG
  2.  
  3. DIM SHARED pArr(1 TO 9) AS LONG
  4. DIM i AS LONG, n AS LONG, m AS LONG, a(1 TO 9) AS LONG, s(1 TO 3) AS LONG, t(1 TO 3) AS STRING
  5. n = 9 'количество камней
  6. m = 3 'количество рюкзаков
  7. FOR i = 1 TO n: READ a(i): NEXT i 'чтение весов камней
  8. FOR i = 1 TO n: READ pArr(i): NEXT i 'чтение начальной расстановки
  9.  
  10. DO
  11.     FOR i = 1 TO m
  12.         s(i) = 0 'сумма в рюкзаке
  13.         t(i) = "" 'содержание рюкзака
  14.     NEXT i
  15.     FOR i = 1 TO n
  16.         s(pArr(i)) = s(pArr(i)) + a(i) 'считаем сумму в рюкзаках
  17.         t(pArr(i)) = t(pArr(i)) + "+" + LTRIM$(STR$(a(i))) 'формируем состав рюкзака
  18.     NEXT i
  19.  
  20.     FOR i = 2 TO m 'проверка на равенство веса во всех рюкзаках
  21.         IF s(1) <> s(i) THEN GOTO NextDo 'суммы не совпадают, к следующей перестановке
  22.     NEXT i
  23.     FOR i = 1 TO m 'если вес во всех рюкзаках одинаковый, то выводим решение
  24.         PRINT MID$(t(i), 2),
  25.     NEXT i
  26.     PRINT
  27. NextDo:
  28. LOOP WHILE MyNarayanaNextPerm(n)
  29. SLEEP
  30. DATA 1, 2, 3, 4, 5, 6, 7, 8, 9
  31. DATA 1, 1, 2, 2, 2, 3, 3, 3, 3
  32.  
  33. FUNCTION MyNarayanaNextPerm(n AS LONG) AS LONG
  34.     DIM i AS LONG, k AS LONG, t AS LONG
  35.     FOR k = n - 1 TO 1 STEP -1
  36.         IF pArr(k) < pArr(k + 1) THEN EXIT FOR
  37.     NEXT k
  38.     IF k THEN
  39.         t = n
  40.         WHILE t > k AND pArr(k) >= pArr(t)
  41.             t = t - 1
  42.         WEND
  43.         SWAP pArr(k), pArr(t)
  44.         t = n
  45.         FOR i = k + 1 TO (n + k) \ 2
  46.             SWAP pArr(i), pArr(t)
  47.             t = t - 1
  48.         NEXT i
  49.         MyNarayanaNextPerm = i
  50.     END IF
  51. END FUNCTION

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


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

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

13   голосов , оценка 4.154 из 5

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

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

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