#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