Zast23 Ответов: 1

Как Хелен покупает больше всего тетрадей?


Проблема:
Хелен-школьная учительница, которая имеет м долларовый. Хелен хочет купить как можно больше блокнотов. Есть н магазины, которые продают пачки блокнотов. Массив bundleQuantities хранит количество записных книжек, проданных в пачке каждым из н магазины. Массив bundleCosts держит в руках н стоимость соответствующих пакетов.

Инфо:
- м является положительным целым числом
- н >= 2
- Элементы bundleQuantities и bundleCosts являются целыми положительными числами, они оба имеют длину н и индексы coorespond: i-й элемент bundleQuantities соответствует i-му элементу bundleCosts.

Цель:
Напишите функцию вида: mostnotebook(m, bundleQuantities, bundleCosts), которая возвращает наибольшее количество ноутбуков, приобретенных за m долларов.

Пример:
большинство книг(50, [20, 19], [24, 19]) вернул бы 40.

Что я уже пробовал:

Я нашел самые возможные пакеты, которые можно купить в каждом магазине для <= м долларовый.

Я создал диапазоны из каждого из них наиболее покупаемые-на-каждый-магазине границы.

Я хотел попытаться найти каждую перестановку всех этих диапазонов и сравнить количество записных книжек, которым это соответствовало (только если они стоили <= м долларовый). Однако я не мог заставить это работать :(.

from itertools import product

def mostNotebooks(n, bundleQuantities, bundleCosts):
     
    maxPurchasable = []

    for i in range(len(bundleCosts)):
        ithRange = []
        for j in range((n//bundleCosts[i])+1):
            ithRange.append(j)
        maxPurchasable.append(ithRange)
    
    currPermute = product(maxPurchasable[0], maxPurchasable[1])        
    
    permute = []
    for c in currPermute:
        permute.append(list(c))
        
    print(permute)
        
    mostBundles = 0
    for p in permute:
        currCost = 0
        currBundles = 0
        for i in range(len(bundleCosts)):
            currCost += bundleCosts[i] * p[i]
            currBundles += bundleQuantities[i] * p[i]
            if currCost > n:
                currBundles = 0
                break
        if currBundles > mostBundles:
            mostBundles = currBundles
    
    print(mostBundles)
    return mostBundles

OriginalGriff

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

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

Zast23

Спасибо, я выложу код, который уже пробовал.

CHill60

Не могли бы вы также объяснить, в чем заключается проблема в настоящее время

Zast23

Я не могу заставить перестановки правильно работать с itertools.product (я тоже пробовал перестановку и комбинацию itertools). Но это также крайне неэффективно, и я хотел бы знать, есть ли лучший способ подойти к этому концептуально?

Patrice T

В чем же проблема ?

Zast23

Есть ли более эффективное решение? Мне не нужен код, только концепция.

Patrice T

Ознакомиться С С1.
У вас есть образец побольше?
Есть ли у вас URL-адрес, где вы нашли вызов?

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Я хотел попытаться найти каждую перестановку всех этих диапазонов и сравнить количество записных книжек, которым это соответствовало (только если они стоили <= m долларов). Однако я не мог заставить это работать :(.

Я думаю, что "найти каждую перестановку" - это неправильный подход. Перестановки - это порядок расслоений.
Вам нужно найти наилучшее сочетание количества пачек. Положение пачки на самом деле не имеет значения, только количество.
Смарт перестановка сортировка может быть только своего рода предварительной обработкой, чтобы ускорить поиск наилучшего решения.
[обновление]
Цитата:
Но это также крайне неэффективно

Совет: возьмите лист бумаги и решите задачу вручную, решите ее снова с помощью набора из 5 различных Пучков. Посмотрите, как вы его решили, и переведите его в алгоритм и Закодируйте. Посмотрите, насколько он эффективен, и как вы можете его улучшить.