46 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from utils import get, init_table, print_table
 | |
| 
 | |
| def max_haul(capacity, items, names):
 | |
|     table = init_table(rows=len(items), cols=capacity, default=0)
 | |
|     items_table = init_table(rows=len(items), cols=capacity, default=[])
 | |
|     for row in range(len(table)):
 | |
|         for col in range(len(table[row])):
 | |
|             kg, value = items[row]
 | |
|             curr_capacity = col + 1
 | |
| 
 | |
|             if kg > curr_capacity:
 | |
|                 a = 0
 | |
|             else:
 | |
|                 a = value + get(table, row - 1, curr_capacity - kg - 1)
 | |
|             b = get(table, row - 1, col)
 | |
| 
 | |
|             if a > b:
 | |
|                 rest = get(items_table, row - 1, curr_capacity - kg - 1)
 | |
|                 knapsack = [names.get(items[row])]
 | |
|                 if rest:
 | |
|                     knapsack += rest
 | |
|             else:
 | |
|                 knapsack = get(items_table, row - 1, col)
 | |
| 
 | |
|             table[row][col] = max([a, b])
 | |
|             items_table[row][col] = knapsack
 | |
|         print_table(table)
 | |
|     return items_table[-1][-1]
 | |
| 
 | |
| water = (3, 10)
 | |
| book = (1, 3)
 | |
| food = (2, 9)
 | |
| jacket = (2, 5)
 | |
| camera = (1, 6)
 | |
| items = [water, book, food, jacket, camera]
 | |
| result = max_haul(6, items, {
 | |
|     water: 'water',
 | |
|     book: 'book',
 | |
|     food: 'food',
 | |
|     jacket: 'jacket',
 | |
|     camera: 'camera',
 | |
| })
 | |
| expected = ['camera', 'food', 'water']
 | |
| print(result, expected)
 | |
| assert result == expected
 | |
| print("Success!")
 |