subtree(users/wpcarro): docking briefcase at '24f5a642'
git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
This commit is contained in:
commit
019f8fd211
766 changed files with 175420 additions and 0 deletions
61
users/wpcarro/scratch/facebook/cake_thief.py
Normal file
61
users/wpcarro/scratch/facebook/cake_thief.py
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
from math import floor
|
||||
|
||||
def print_table(table):
|
||||
print('\n-- TABLE --')
|
||||
for row in range(len(table)):
|
||||
x = ''
|
||||
for col in range(len(table[row])):
|
||||
x += ' ' + str(table[row][col])
|
||||
print(x)
|
||||
|
||||
def leftover(capacity, kg):
|
||||
n = floor(capacity / kg)
|
||||
return n, capacity - (n * kg)
|
||||
|
||||
def init_table(num_rows, num_cols):
|
||||
table = []
|
||||
for _ in range(num_rows):
|
||||
row = []
|
||||
for _ in range(num_cols):
|
||||
row.append(0)
|
||||
table.append(row)
|
||||
return table
|
||||
|
||||
def get(table, row, col):
|
||||
if row < 0 or col < 0:
|
||||
return 0
|
||||
return table[row][col]
|
||||
|
||||
def max_haul(items, capacity):
|
||||
table = init_table(len(items), capacity)
|
||||
|
||||
for row in range(len(table)):
|
||||
for col in range(len(table[row])):
|
||||
curr_capacity = col + 1
|
||||
kg, val = items[row]
|
||||
# A
|
||||
a = get(table, row - 1, col)
|
||||
# B
|
||||
n, lo = leftover(curr_capacity, kg)
|
||||
b = (val * n) + get(table, row - 1, lo - 1)
|
||||
# commit
|
||||
if kg > curr_capacity:
|
||||
table[row][col] = a
|
||||
else:
|
||||
print(n, lo)
|
||||
table[row][col] = max([a, b])
|
||||
print_table(table)
|
||||
return table[-1][-1]
|
||||
|
||||
# There are multiple variants of this problem:
|
||||
# 1. We're allowed to take multiple of each item.
|
||||
# 2. We can only take one of each item.
|
||||
# 3. We can only take a fixed amount of each item.
|
||||
|
||||
items = [(7,160), (3,90), (2,15)]
|
||||
capacity = 20
|
||||
result = max_haul(items, capacity)
|
||||
expected = None
|
||||
print("Result: {} == Expected: {}".format(result, expected))
|
||||
assert result == expected
|
||||
print("Success!")
|
||||
Loading…
Add table
Add a link
Reference in a new issue