Вопрос состоит в том, чтобы указать цену продукта, например [2,3,5,1,1,2,1], и бюджет, равный 5, выход должен быть максимальным количеством продукта, которое можно купить. Для этого - 4 ([1,1,2,1])

У меня есть код ниже, иногда он работает, но по цене вроде [2,3,5,1], budget = 7 и должно быть 3, но это 2. Не могли бы вы, ребята, помочь проверить, какая часть моего кода неверна? Спасибо

def getMaximumOutfits(money,outfits):
  result = []
  spent = 0
  max_length = 0
  for i in range(len(outfits)):
      spent+=outfits[i]
      if spent <=money:
          if i!=len(outfits)-1:
              result.append(outfits[i])
          else:
              result.append(outfits[i])
              if max_length < len(result):
                  max_length = len(result)
      else:
          if max_length<len(result):
              max_length = len(result)
          result=[]
          spent = outfits[i]
          if spent <= money:
              result.append(outfits[i])
  print(max_length)
0
Yiming 7 Окт 2020 в 22:14

2 ответа

Лучший ответ

То, как вы настроили свою программу, чтобы попробовать все варианты, противоречит интуиции. Вместо того, чтобы каждый раз повторять попытки с нуля, если вы сначала отсортируете список, вам нужно будет просмотреть список только один раз. Вы можете сделать это довольно просто, поставив в начале outfits=sorted(outfits). Это устраняет необходимость в большей части вашего кода, так как самый дешевый вариант всегда будет первым.

Еще одно улучшение, которое вы можете сделать, заключается в том, что вам действительно не нужно отслеживать такие вещи, как потраченные и результат. Поскольку единственное, что вас волнует, это то, сколько предметов вы можете купить, вы можете просто создать переменную (которая начинается с 0) и добавлять к ней 1 каждый раз, когда вы можете позволить себе новый предмет.

Другое возможное улучшение состоит в том, что вместо проверки каждый раз if spent<money вы можете просто рассматривать деньги как свой «баланс» и вычитать потраченную сумму из общей суммы, пока деньги не станут меньше нуля.

Просто как быстрый побочный момент, вместо того, чтобы писать

for i in len(outfits):
    spent+=outfits[i]       

Вы можете перебирать сам список

for i in outfits:
    spent+=i

И получите тот же результат

Ваш окончательный код должен выглядеть примерно так:

def getMaximumOutfits(money,outfits):
    outfits=sorted(outfits)#sorts the list from smallest --> biggest
    items=0
    max_size=0
    for i in outfits: #goes through each element in the outfit list
        money-=i   #subtracts the cost of this item from the remaining money
        if money<0: #if they couldn't afford this item
            max_size=items #the amount of items they had before this one is their max
        else: #if they can afford this item
            items+=1 #the total items goes up by 1
    return(max_size)
print(getMaximumOutfits(7,[2,3,5,1]))
>>> 3

Любые вопросы, не стесняйтесь спрашивать ;)

0
E-A 7 Окт 2020 в 19:54

Сортируйте цены от наименьших к наибольшим, прежде чем запускать цикл. В вашем примере он добавляет 2, затем 3, затем 5 и видит, что это больше 7, поэтому он возвращает 2. Если бы это было правильно, он бы добавил 1, 2 и 3, прежде чем перейти к 5.

2
Michael Royston 7 Окт 2020 в 19:23