Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7

Задача про людей и мешки

17.04.2019, 16:31. Показов 3836. Ответов 14

Студворк — интернет-сервис помощи студентам
Господа, подскажите как решить вот такую проблему:
есть n пакетов, нужно найти количество человек, которое требуется, чтобы перенести все пакеты. При этом каждый может нести не более 2 пакетов. Для всех человек есть некая константа m - предельная масса, которую человек может перенести.

Первая строка содержит число m (1 ⩽ m ⩽ 1000000) — максимальную массу,
которую может поднять человек. Вторая строка входных данных содержит количество
пакетов n (1 ⩽ n ⩽ 100). Следующие n строк содержат по одному числу ai (1 ⩽ ai ⩽ m) —
массы пакетов.

Программа должна вывести одно число — минимальное количество человек,
необходимое для переноски всех пакетов.

Примеры тестов:
Вход:
10
4
4
4
8
6
Выход: 3

Вход:
10
4
5
3
4
5
Выход: 2
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2019, 16:31
Ответы с готовыми решениями:

Задача про выбывающих из круга людей.
По кругу расположено N человек. Начиная с некоторой позиции, мы считаем по кругу и каждый третий человек выбывает из круга, при этом круг...

Задача про людей в управляющем совете
Прошу пожалуйста помочь решить задачу Управляющий совет В управляющий совет школы входят родители, учителя и учащиеся школы, причём...

Задача про 100 людей и анкета в 150 пунктов
100 людей отвечают в анкете из 150 пунктов выбирают ответ да, нет или затрудняюсь ответить. Вывести только те пункты где все ответили...

14
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
18.04.2019, 11:14
Задача на динамическое программирование.

На вход рекурсивной функции нужно будет подать множество пакетов и людей, причём человек будет задаваться двумя параметрами - кол-вом пакетов, которые он ещё может взять - 1 или 2, ну и сколько массы ещё унесёт.
0
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7
18.04.2019, 11:18  [ТС]
Для того, чтобы этого человека задать, нужно создать пары? И как изменить рекурсивную функцию нужно же как то избавляться от пакетов, которые уже были подобраны?Не могли бы вы, если нетрудно привести шаблон кода, я раньше на практике не применял динамическое программирование.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
18.04.2019, 12:12
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
m, n, a = int(input()), int(input()), []
 
for i in range(n):
  a.append(int(input()))
 
k, s, i = 0, 0, 0
 
while a:
  while i<len(a):
    if (s + a[i]) <= m:
      s += a[i]
      del a[i]
    else:
      i += 1
  else:
    k += 1
    s, i = 0, 0
 
print(k)
0
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7
18.04.2019, 12:19  [ТС]
Как здесь выполняется условие про 2 пакета максимум, ведь s может добавляться больше 1 раза?
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
18.04.2019, 12:20
Stranger99, я это вам оставил.
0
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7
18.04.2019, 12:22  [ТС]
Да, но программа, прошла все тесты кроме одного секретного
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
18.04.2019, 12:23
Цитата Сообщение от Stranger99 Посмотреть сообщение
Для того, чтобы этого человека задать, нужно создать пары?
Логически - да. Как в коде реализуете - это уже детали. Думаю, кортежей хватит.

Цитата Сообщение от Stranger99 Посмотреть сообщение
И как изменить рекурсивную функцию нужно же как то избавляться от пакетов, которые уже были подобраны?
А вы знаете, что такое рекурсия?

Цитата Сообщение от Stranger99 Посмотреть сообщение
Не могли бы вы, если нетрудно привести шаблон кода, я раньше на практике не применял динамическое программирование.
Да я уж понял.

Увы, это займёт время, которого мне жаль.
При этом мне понадобится почитать теорию, освежить в памяти, как в ДП для подобных сложных случаев делается кеширование. Так-то я читал, но уже забыл. (Кормен и др, "Алгоритмы, построение и анализ".) Я дал вам наводку, что читать.

ДП - это рекурсия плюс кеширование (без него работать будет, но невероятно долго). Никакого сакрального знания.
Сделайте сначала просто рекурсивное решение, без кеширования, откатайте на маленьких случаях.

m0nte-cr1st0, ваше решение неправильное. Потому что тут ДП, а у вас его нет.
1
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7
18.04.2019, 12:25  [ТС]
Попытаюсь
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
18.04.2019, 12:35
Цитата Сообщение от Stranger99 Посмотреть сообщение
Да, но программа, прошла все тесты кроме одного секретного
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
m, n, a = int(input()), int(input()), []
 
for i in range(n):
  a.append(int(input()))
 
k, s, i, x = 0, 0, 0, 0
 
while a:
  while i<len(a) and x < 2:
    if (s + a[i]) <= m:
      s += a[i]
      del a[i]
      x += 1
    else:
      i += 1
  else:
    k += 1
    s, i, x = 0, 0, 0
 
print(k)
Добавлено через 24 секунды
Цитата Сообщение от dondublon Посмотреть сообщение
ваше решение неправильное. Потому что тут ДП, а у вас его нет.
вроде, нигде не сказано о ДП..
0
-4 / 0 / 0
Регистрация: 05.06.2018
Сообщений: 7
18.04.2019, 13:00  [ТС]
Ничего не изменилось

Добавлено через 10 минут
Кстати ДП нужно не обязательно, проблема уже решена.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
maxWeight = int(input())
packagesAmount = int(input())
packagesWeightList = []
 
for i in range(packagesAmount):
    packagesWeightList.append(int(input())) 
 
weightOnPeople = 0
packagesCountOnPeople = 0
peopleAmount = 0
sortedWeightList = []
maxSumm = 0
sumIndex = 0   
 
 
 
for i in range(packagesAmount):
    if packagesWeightList[i] != -1:
        sortedWeightList.append(packagesWeightList[i])
        
        for j in range(i + 1, packagesAmount):
            if (packagesWeightList[i] + packagesWeightList[j]) <= maxWeight and (packagesWeightList[i] + packagesWeightList[j]) > maxSumm and packagesWeightList[j] != -1:
                maxSumm = packagesWeightList[j] + packagesWeightList[i]
                sumIndex = j
        if packagesWeightList[i] < maxSumm:
            sortedWeightList.append(packagesWeightList[sumIndex]) 
            packagesWeightList[sumIndex] = -1
            maxSumm = 0
            sumIndex = 0
 
for i in range(packagesAmount):
    if(packagesCountOnPeople == 2) or (weightOnPeople + sortedWeightList[i] > maxWeight):
        packagesCountOnPeople = 0
        weightOnPeople = 0
        peopleAmount += 1
 
    weightOnPeople+= sortedWeightList[i]
    packagesCountOnPeople += 1
 
    if i == packagesAmount - 1 and weightOnPeople <= maxWeight and packagesCountOnPeople <= 2:
        peopleAmount += 1
    
 
print(peopleAmount)
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
18.04.2019, 13:04
Stranger99, мб проверку добавить надо.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
m, n, a = int(input()), int(input()), []
 
for i in range(n):
  a.append(int(input()))
 
k, s, i, x = 0, 0, 0, 0
 
if max(a) <= m:
  while a:
    while i<len(a) and x < 2:
      if (s + a[i]) <= m:
        s += a[i]
        del a[i]
        x += 1
      else:
        i += 1
    else:
      k += 1
      s, i, x = 0, 0, 0
   
  print(k)
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
18.04.2019, 13:28
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
вроде, нигде не сказано о ДП.
Конечно, ученик сам должен догадаться.

Добавлено через 1 минуту
Stranger99, ваше решение тоже неправильное, по той же причине. Если постараться, можно будет найти контрпример.

Добавлено через 5 минут
Stranger99, с первого взгляда, если не вникать, ваш код похож на жадный алгоритм. Немного похож на ДП, но всё-таки не то, он для задач попроще.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
18.04.2019, 14:18
dondublon, неужто эту задачу без ДП не решить?..
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
18.04.2019, 19:22
Stranger99, m0nte-cr1st0, простите меня, люди.
Я думал-думал и понял, что задача действительно решается жадным алгоритмом.

Действительно, на первом шаге мы нам достаточно выбрать такую пару, чтобы заполнить грузоподъёмность одного человека, как можно лучше. Любое другое решение не сделает его лучше.

У человека всего два пакета, поэтому нам достаточно двух вложенных циклов. Вот если бы пакетов на одного человека было неограниченное число - тогда да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2019, 19:22
Помогаю со студенческими работами здесь

Как можно делать конвертация для ед.изм у меня кг шт метр и мешки есть и должно быть кг на шт,метр,мешки ?
как можно делать конвертация для ед.изм у меня кг шт метр и мешки есть и должно быть кг на шт,метр,мешки ?

Про умных людей
Опрос: подтверждают ли ваши наблюдения за вашими знакомыми, что люди с высокими способностями в математике в среднем менее адекватны в...

Ищу людей в проект (сайт про IT-технологии)
Доброго времени суток! Хотелось бы найти единомышленников в проект ( новостной сайт про IT-технологии ). Сайт уже сделан и работает....

Блок схема про людей, кошек и мух
Помогите пожалуйста!!!! Задача: В комнате N человек, M кошек, и К мух. Вместе у них 100 ног и лап. Вычислить сколько в комнате...

Тупенький зумерок спрашивает у знающих людей про железяки для игрулек
Вот сразу сборочка https://www.dns-shop.ru/custompc/configuration/54145d9754e8d867/ Хотелось бы увидеть какую-то конструктивную критику...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru