Как составить список только из минимальных значений

#python #list

#python #Список

Вопрос:

Есть задача. Пользователь вводит значения ‘s’, которые представляют объем доступного пространства в воображаемой базе данных, после этого ‘n’ должно быть введено количество пользователей. После этого действия пользователь вводит количество «пространства», которое требуется каждому пользователю. Программа должна рассчитать, сколько пользователей может поместиться в базе данных. Моя логика была следующей: прежде всего, после «требования к пространству» список входных данных сортируется. Затем появляется список ‘minn’ для сбора значений в будущем. Во-вторых, если сумма требуемого пространства равна ‘s’, выводится количество пользователей ‘n’. Если нет, он должен пройти через все элементы в ‘numUsers’, и если их сумма меньше ‘s’, они должны быть добавлены к списку ‘minn’. Но это не работает.

 s, n = list(map(int, input().split()))
numUsers = []
count = 0
for i in range(n):
    numUsers.append(int(input()))
    
numUsers.sort()

minn = []

if sum(numUsers) == s:
    print(n)
elif (s - sum(numUsers) < 0):
    for i in numUsers:
        while sum(minn) < s:
            minn.append(i)
            count  = 1
print(count)
  

для ввода:

  • 100 3
  • 50
  • 30
  • 50

Согласно логике, у меня есть 130 в виде суммы (numUsers), что намного больше, чем ‘s’. Он отсортирован, поэтому он должен быть [30, 50, 50]. Возможно, что-то идет не так после того, как значение становится 90 или что-то в этом роде, но я не могу понять, что именно. Я почему-то получаю 4 вместо 2. Не могли бы вы дать мне совет о том, что не так с кодом или с логикой, которую я использовал при решении задачи. Большое вам спасибо.

Комментарии:

1. Почему бы не использовать 0/1 knapsack и не распечатать элементы? Я думаю, что это проблема с рюкзаком 0/1.

2. @DeepakTripathi Если бы я только знал, о чем это

Ответ №1:

Это выражение:

 while sum(minn) < s:
  

…не включает число, которое вы собираетесь добавить, поэтому условие действительно должно быть:

 sum(minn)   i <= s:
  

Тогда while цикл потенциально может добавить одно и то же значение i дважды или более в minn список, поэтому оно должно быть просто if .

 if sum(minn)   i <= s:
  

Существует и другая проблема: когда sum(numUsers) меньше s , ваш код возвращает 0.

Вы должны изменить это:

 if sum(numUsers) == s:
    print(n)
elif (s - sum(numUsers) < 0):
  

к этому:

 if sum(numUsers) <= s:
    print(n)
else:
  

… но вы можете даже решить полностью пропустить эти три строки и просто использовать то, что находится в else блоке.

Кроме того, вы на самом деле не используете minn для вывода, поэтому вы могли бы просто сохранить текущую сумму вместо списка.

Чтобы избежать путаницы, вот полный код с вышеупомянутыми изменениями:

 def solve(s, n, numUsers):
    numUsers.sort()
    count = 0
    runningSum = 0
    for i in numUsers:
        if runningSum   i > s:
            break
        runningSum  = i
        count  = 1
    return count
  

Пример вызова:

 s = 100 
n = 2
numUsers = [200, 30]
print(solve(s, n, numUsers))  # 1
  

Комментарии:

1. @trincot — думаю, вы if runningSum i <= s: не while runningSum i <= s: собирались. и при желании можно добавить else break .

2. Если у вас есть такие данные, как: 100 2 200 30, ответ будет: 3

3. Вы говорите, что ответ должен быть 3?? Потому что этот код будет отвечать 1, поскольку в сумму можно включить только 30. Посмотрите, как он выполняется на repl.it

Ответ №2:

Возможные изменения:

 summ = 0
newList = sorted(numUsers)

for i in range(len(newList)):
    summ  = newList[i]
    count  = 1
    if summ > s:
        count -= 1
        break
print(count)

  

Комментарии:

1. Насколько это проще, чем то, что я ответил?

2. Не проще. Я написал под предыдущим комментарием, что в случае данных: 100 2 200 30 это даст вам 3 в качестве результата вместо 1. @trincot

3. И вы читали мой комментарий? Мой код не возвращает 3. Вы, должно быть, сделали что-то не так в своей реализации. Вы проверили ссылку, которую я опубликовал? Кроме того, в этом ответе вы пишете «более простые изменения». Отсюда мой вопрос.

4. Теперь я вижу. Мой плохой. @trincot