2019-07-13 07:12:54 +00:00
|
|
|
from typing import List
|
|
|
|
|
|
|
|
def rod_cutting(prices: List[int],length: int) -> int:
|
|
|
|
"""
|
|
|
|
Given a rod of length n and array of prices that indicate price at each length.
|
|
|
|
Determine the maximum value obtainable by cutting up the rod and selling the pieces
|
|
|
|
|
|
|
|
>>> rod_cutting([1,5,8,9],4)
|
|
|
|
10
|
|
|
|
>>> rod_cutting([1,1,1],3)
|
|
|
|
3
|
|
|
|
>>> rod_cutting([1,2,3], -1)
|
|
|
|
Traceback (most recent call last):
|
|
|
|
ValueError: Given integer must be greater than 1, not -1
|
|
|
|
>>> rod_cutting([1,2,3], 3.2)
|
|
|
|
Traceback (most recent call last):
|
|
|
|
TypeError: Must be int, not float
|
|
|
|
>>> rod_cutting([], 3)
|
|
|
|
Traceback (most recent call last):
|
|
|
|
AssertionError: prices list is shorted than length: 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
prices: list indicating price at each length, where prices[0] = 0 indicating rod of zero length has no value
|
|
|
|
length: length of rod
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Maximum revenue attainable by cutting up the rod in any way.
|
|
|
|
"""
|
|
|
|
|
|
|
|
prices.insert(0, 0)
|
|
|
|
if not isinstance(length, int):
|
|
|
|
raise TypeError('Must be int, not {0}'.format(type(length).__name__))
|
|
|
|
if length < 0:
|
|
|
|
raise ValueError('Given integer must be greater than 1, not {0}'.format(length))
|
|
|
|
assert len(prices) - 1 >= length, "prices list is shorted than length: {0}".format(length)
|
|
|
|
|
|
|
|
return rod_cutting_recursive(prices, length)
|
|
|
|
|
|
|
|
def rod_cutting_recursive(prices: List[int],length: int) -> int:
|
|
|
|
#base case
|
|
|
|
if length == 0:
|
|
|
|
return 0
|
|
|
|
value = float('-inf')
|
|
|
|
for firstCutLocation in range(1,length+1):
|
|
|
|
value = max(value, prices[firstCutLocation]+rod_cutting_recursive(prices,length - firstCutLocation))
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
assert rod_cutting([1,5,8,9,10,17,17,20,24,30],10) == 30
|
|
|
|
# print(rod_cutting([],0))
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|
|
|
|
|