You and your best friend Stripes have just landed your first high school jobs! You'll be delivering newspapers to your neighbourhood on weekends. For your services you'll be charging a set price depending on the quantity of the newspaper bundles.

The cost of deliveries is:

- $3.85 for 40 newspapers
- $1.93 for 20
- $0.97 for 10 
- $0.49 for 5 
- $0.10 for 1 

Stripes is taking care of the footwork doing door-to-door drops and your job is to take care of the finances. What you'll be doing is providing the cheapest possible quotes for your services.

Write a function that's passed an integer representing the amount of newspapers and returns the cheapest price. The returned number must be rounded to two decimal places.

![Paperboy](http://mametesters.org/file_download.php?file_id=1016&type=bug)

Difficulty: introductory

Starter code:

def cheapest_quote(n):
	

Solutions:
def cheapest_quote(n):
    prices = [(40, 3.85), (20, 1.93), (10, 0.97), (5, 0.49), (1, 0.10)]
    result = 0
    for q, c in prices:
        result += n // q * c
        n = n % q
    return round(result, 2)
        


def f(n, v):
    # Removes remainders from Calculation
    #     Technically not doing this will still work 
    #     in python 2 but I considered it to be bad 
    #     practice, so I changed it.
    return n / v - (n % v) / v
    
def cheapest_quote(n):
    # Pattern max 4:
    #     n*.1 (solution without 'discounts')
    #   Subtract sum of total by sum of discount:
    #     divide by 5 and then 2 (repeat) until 1;
    #     multply by .01 (change to fraction).
    #   Simplified n/5/2 to n/10 and so on.
    return round(n*.1-(f(n, 5)+f(n, 10)+f(n, 20)+f(n, 40))*.01, 2)

DELIVERY_COST = ((40, 385), (20, 193), (10, 97), (5, 49), (1, 10))


def cheapest_quote(n):
    result = 0
    for total_newspapers, cost_of_newspapers in DELIVERY_COST:
        q, r = divmod(n, total_newspapers)
        if q:
            n -= q * total_newspapers
            result += q * cost_of_newspapers
        if not r:
            break
    return result / 100.0


def cheapest_quote(papers):

    prices = {40:3.85, 20:1.93, 10:0.97, 5:0.49, 1:0.10}
    cost = 0
    
    for price in prices:
        cost += (papers // price) * prices[price]
        papers %= price
    
    return round(cost, 2)
    
    # 7kyu kata number one thousand


d={40:3.85, 20:1.93, 10:0.97, 5:0.49, 1:0.10}
def cheapest_quote(n):
    papers, total = 40, 0
    while n>0:
        if n>=papers:
            total += d[papers]*(n//papers)
            n %= papers
        if papers>5: papers //=2
        else: papers = 1
    return round(total,2)

def cheapest_quote(n):
    rates = [(40, 3.85), (20, 1.93), (10, 0.97), (5, 0.49), (1, 0.1)]
    total = 0
    for bundle, price in rates:
        total += n//bundle * price
        n %= bundle
    return round(total, 2)

costs = [
    (3.85, 40),
    (1.93, 20),
    (0.97, 10),
    (0.49, 5),
    (0.10, 1),
]


def cheapest_quote(n):
    price = 0
    for cost, qty in costs:
        q, n = divmod(n, qty)
        price += cost * q
    return round(price, 2)

def cheapest_quote(n):
    price, costs = 0, [(1, 0.1), (5, 0.49), (10, 0.97), (20, 1.93), (40, 3.85)]
    while n:
        quantity, cost = costs.pop()
        price += (n // quantity) * cost
        n %= quantity
    return round(price, 2)

bundles = {40:3.85, 20:1.93, 10:0.97, 5:0.49, 1:0.10}

def cheapest_quote(n):
   
    if n == 0 : return 0.00    
    
    for i in [40,20,10,5,1] :
        if n-i > -1:   
            return round(int(n/i) * bundles[i] + cheapest_quote(n%i), 2)
            


def cheapest_quote(n):

    if n < 1:
        return 0
    
    bundles = iter([(40, 3.85), (20, 1.93), (10, 0.97), (5, 0.49), (1, 0.1)])
    total = 0
    
    while n > 0:
        size, price = next(bundles)
        if size <= n:
            q, n = divmod(n, size)
            total += q * price
            
    return round(total, 2)

d = __import__("collections").OrderedDict(
    [(int(y), float(x)) for x, y in __import__("re").findall(r"(\d\.\d{2}).*?(\d+)",
        """
        $3.85 for 40 newspapers
        $1.93 for 20
        $0.97 for 10
        $0.49 for 5
        $0.10 for 1
        """)
    ])

def cheapest_quote(n, r = 0):
    for k, v in d.items():
        r += n // k * v
        n %= k
        if not n: break
    return round(r, 2)

b = {40:3.85,20:1.93,5:0.49,1:0.1,10:0.97}
def cheapest_quote(n):
    a = [0.0]
    while n != 0:
        if n - 40 >= 0:
            n-= 40
            a.append(b[40])
            continue
        if n - 20 >= 0:
            n-= 20
            a.append(b[20])
            continue
        if n - 10 >= 0:
            n-= 10
            a.append(b[10])
            continue
        if n - 5 >= 0:
            n-= 5
            a.append(b[5])
            continue
        if n - 1 >= 0:
            n-= 1
            a.append(b[1])
            continue
        if n < 0:
            break
    return round(sum(a),2)

def cheapest_quote(n):

    s1 = n // 40
    y1 = n % 40
    
    s2 = y1 // 20
    y2 = y1 % 20
    
    s3 = y2 // 10
    y3 = y2 % 10
    
    s4 = y3 // 5
    y4 = y3 % 5
    
    return float('%.2f'%(s1 * 3.85 + s2 * 1.93 + s3 * 0.97 + s4 * 0.49 + y4 * 0.10))

def cheapest_quote(n):
    forty = int(n/40) 
    twenty = int((n - (forty*40))/20) 
    ten = int((n - (forty*40) - (twenty*20))/10) 
    five = int((n-(forty*40) -(twenty*20) - (ten*10))/5) 
    one = int((n-(forty*40)-(twenty*20)-(ten*10)-(five*5))/1) 
    return round((forty*3.85) + (twenty*1.93) + (ten*.97) + (five*.49) + (one*.1),2)