|
| 1 | +#!/usr/bin/python |
| 2 | +# -*- coding: UTF-8 -*- |
| 3 | + |
| 4 | +from typing import List, Tuple |
| 5 | + |
| 6 | + |
| 7 | +def bag(items_info: List[int], capacity: int) -> int: |
| 8 | + """ |
| 9 | + 固定容量的背包,计算能装进背包的物品组合的最大重量 |
| 10 | +
|
| 11 | + :param items_info: 每个物品的重量 |
| 12 | + :param capacity: 背包容量 |
| 13 | + :return: 最大装载重量 |
| 14 | + """ |
| 15 | + n = len(items_info) |
| 16 | + memo = [[-1]*(capacity+1) for i in range(n)] |
| 17 | + memo[0][0] = 1 |
| 18 | + if items_info[0] <= capacity: |
| 19 | + memo[0][items_info[0]] = 1 |
| 20 | + |
| 21 | + for i in range(1, n): |
| 22 | + for cur_weight in range(capacity+1): |
| 23 | + if memo[i-1][cur_weight] != -1: |
| 24 | + memo[i][cur_weight] = memo[i-1][cur_weight] # 不选 |
| 25 | + if cur_weight + items_info[i] <= capacity: # 选 |
| 26 | + memo[i][cur_weight + items_info[i]] = 1 |
| 27 | + |
| 28 | + for w in range(capacity, -1, -1): |
| 29 | + if memo[-1][w] != -1: |
| 30 | + return w |
| 31 | + |
| 32 | + |
| 33 | +def bag_with_max_value(items_info: List[Tuple[int, int]], capacity: int) -> int: |
| 34 | + """ |
| 35 | + 固定容量的背包,计算能装进背包的物品组合的最大价值 |
| 36 | +
|
| 37 | + :param items_info: 物品的重量和价值 |
| 38 | + :param capacity: 背包容量 |
| 39 | + :return: 最大装载价值 |
| 40 | + """ |
| 41 | + n = len(items_info) |
| 42 | + memo = [[-1]*(capacity+1) for i in range(n)] |
| 43 | + memo[0][0] = 0 |
| 44 | + if items_info[0][0] <= capacity: |
| 45 | + memo[0][items_info[0][0]] = items_info[0][1] |
| 46 | + |
| 47 | + for i in range(1, n): |
| 48 | + for cur_weight in range(capacity+1): |
| 49 | + if memo[i-1][cur_weight] != -1: |
| 50 | + memo[i][cur_weight] = memo[i-1][cur_weight] |
| 51 | + if cur_weight + items_info[i][0] <= capacity: |
| 52 | + memo[i][cur_weight + items_info[i][0]] = max(memo[i][cur_weight + items_info[i][0]], |
| 53 | + memo[i-1][cur_weight] + items_info[i][1]) |
| 54 | + return max(memo[-1]) |
| 55 | + |
| 56 | + |
| 57 | +if __name__ == '__main__': |
| 58 | + # [weight, ...] |
| 59 | + items_info = [2, 2, 4, 6, 3] |
| 60 | + capacity = 9 |
| 61 | + print(bag(items_info, capacity)) |
| 62 | + |
| 63 | + # [(weight, value), ...] |
| 64 | + items_info = [(3, 5), (2, 2), (1, 4), (1, 2), (4, 10)] |
| 65 | + capacity = 8 |
| 66 | + print(bag_with_max_value(items_info, capacity)) |
0 commit comments