def bag(items_info: List[int], capacity: int) -> int: """ 固定容量的背包,计算能装进背包的物品组合的最大重量 :param items_info: 每个物品的重量 :param capacity: 背包容量 :return: 最大装载重量 """ n = len(items_info) memo = [[-1]*(capacity+1) for i in range(n)] memo[0][0] = 1 if items_info[0] <= capacity: memo[0][items_info[0]] = 1
for i in range(1, n): for cur_weight in range(capacity+1): if memo[i-1][cur_weight] != -1: memo[i][cur_weight] = memo[i-1][cur_weight] # 不选 if cur_weight + items_info[i] <= capacity: # 选 memo[i][cur_weight + items_info[i]] = 1
for w in range(capacity, -1, -1): if memo[-1][w] != -1: return w
def bag_with_max_value(items_info: List[Tuple[int, int]], capacity: int) -> int: """ 固定容量的背包,计算能装进背包的物品组合的最大价值 :param items_info: 物品的重量和价值 :param capacity: 背包容量 :return: 最大装载价值 """ n = len(items_info) memo = [[-1]*(capacity+1) for i in range(n)] memo[0][0] = 0 if items_info[0][0] <= capacity: memo[0][items_info[0][0]] = items_info[0][1]
for i in range(1, n): for cur_weight in range(capacity+1): if memo[i-1][cur_weight] != -1: memo[i][cur_weight] = memo[i-1][cur_weight] if cur_weight + items_info[i][0] <= capacity: memo[i][cur_weight + items_info[i][0]] = max(memo[i][cur_weight + items_info[i][0]], memo[i-1][cur_weight] + items_info[i][1]) return max(memo[-1])