Ви рахуєте багато зайвого:
import timeit
import math
def bouquets_3(narcissus_price, tulip_price, rose_price, summ): # koala
prices = sorted([narcissus_price, tulip_price, rose_price], reverse=True)
counter = 0
for i in range(math.floor(summ / prices[0]) + 1):
for j in range(math.floor((summ - i * prices[0]) / prices[1]) + 1):
last_count = math.floor((summ - i * prices[0] - j * prices[1]) / prices[2]) + 1
if (i + j) % 2 == 0:
counter += math.floor(last_count / 2)
else:
counter += math.ceil(last_count / 2)
return counter
def bouquets_2(narcissus_price, tulip_price, rose_price, summ): # ADR
prices = sorted([narcissus_price, tulip_price, rose_price], reverse=True)
count = 0
for count_0 in range(int(summ / prices[0] + 1)):
prices_of_0 = count_0 * prices[0]
for count_1 in range(int((summ - prices_of_0) / prices[1] + 1)):
count_2 = int((summ - prices_of_0 - count_1 * prices[1]) / prices[2]) # скільки можна купити
count += count_2 // 2 # тільки непарні (кожен другий)
if (count_0 + count_1) % 2 or count_2 % 2: # 0 0 1 та 1 0 0 також підходить
count += 1
return count
def bouquets(narcissus_price, tulip_price, rose_price, summ):
n = int(summ // narcissus_price)
k = int(summ // tulip_price)
p = int(summ // rose_price)
count = 0
for i1 in range(0, n + 1):
for i2 in range(0, k + 1):
for i3 in range(0, p + 1):
if i1 * narcissus_price + i2 * tulip_price + i3 * rose_price <= summ:
if (i1 + i2 + i3) % 2 != 0:
count += 1
else:
break
return count
assert bouquets(10, 199, 99, 20000), bouquets_2(10, 199, 99, 20000)
assert bouquets_3(10, 199, 99, 20000), bouquets_2(10, 199, 99, 20000)
assert bouquets(22, 44, 150, 20000), bouquets_2(22, 44, 150, 20000)
assert bouquets_3(22, 44, 150, 20000), bouquets_2(22, 44, 150, 20000)
print('assert done.')
for test_data in ('22, 44, 150, 20000',
'1, 10, 100, 1000',
'100, 100, 100, 1000'):
print('\nArguments: ' + test_data)
for author, func_name, cycles in (('koala', 'bouquets_3', 100),
('ADR', 'bouquets_2', 100),
('prosergii', 'bouquets', 2)):
print('{:10}: {:9.6f}'.format(author, timeit.timeit('{}({})'.format(func_name, test_data),
'from __main__ import {}'.format(func_name),
number=cycles) / cycles))
Результат:
Arguments: 22, 44, 150, 20000
koala : 0.050158
ADR : 0.037348
prosergii : 7.963269
Arguments: 1, 10, 100, 1000
koala : 0.000913
ADR : 0.000671
prosergii : 0.272566
Arguments: 100, 100, 100, 1000
koala : 0.000128
ADR : 0.000095
prosergii : 0.000347
1. Для чого рахувати "що буде, якщо 1000 перших квіток і 1000 других", якщо грошей є лише на 1000 і 500?
2. Для чого рахувати "що буде, якщо 1000 перших квіток, 1000 других і 0,1,2,3,4,5,6,... третіх", якщо можна порахувати скільки тих третіх можна купити?
Та й здається що цю задачу можна вирахувати аналітично. Хоча не впевнений.
Чи задача була саме перебрати всі варіанти?
Update:
Стоп. схожа версія вже була. Чому її не використовували?
Update:
Додав тести всіх версій.