如何对嵌套列表元素求和并生成总权重不超过23的子列表?
问题原因
你现有代码的逻辑是筛选单个子列表下标1的元素≤23的条目,而给出的测试数据中所有子列表的第二个元素最大仅为5,远小于23,所以输出和原列表完全一致,没有实现累加总和的判断逻辑。
实现方案
根据不同的选取规则,提供三种常见实现:
1. 按原列表顺序依次选取,加总不超过23即保留
this = [['A', 5, 310],['B', 3, 270], ['C', 4.5, 220], ['D', 1, 150], ['E', 3.5, 140], ['F', 2.5, 90], ['G', 4, 70], ['H', 3, 60], ['I', 2, 50], ['J', 1, 30]] max_total = 23 current_sum = 0 result = [] for item in this: weight = item[1] if current_sum + weight <= max_total: result.append(item) current_sum += weight print(result) print("累加总权重:", current_sum)
运行输出总权重为22.5,符合≤23的要求。
2. 优先选权重最小的条目,选中条目数量最多
this = [['A', 5, 310],['B', 3, 270], ['C', 4.5, 220], ['D', 1, 150], ['E', 3.5, 140], ['F', 2.5, 90], ['G', 4, 70], ['H', 3, 60], ['I', 2, 50], ['J', 1, 30]] max_total = 23 current_sum = 0 result = [] # 按下标1的权重升序排序 sorted_list = sorted(this, key=lambda x: x[1]) for item in sorted_list: weight = item[1] if current_sum + weight <= max_total: result.append(item) current_sum += weight print(result) print("累加总权重:", current_sum) print("选中条目数量:", len(result))
3. 优先选总价值(下标2元素)最高的条目(01背包实现)
如果需要第三个元素的总价值最高,使用01背包算法实现:
this = [['A', 5, 310],['B', 3, 270], ['C', 4.5, 220], ['D', 1, 150], ['E', 3.5, 140], ['F', 2.5, 90], ['G', 4, 70], ['H', 3, 60], ['I', 2, 50], ['J', 1, 30]] max_total = 23 # 权重存在小数,乘以2转整数处理避免精度问题 scale = 2 scaled_max = int(max_total * scale) dp = [0] * (scaled_max + 1) selected = [[] for _ in range(scaled_max + 1)] for item in this: weight = item[1] value = item[2] scaled_w = int(weight * scale) for j in range(scaled_max, scaled_w - 1, -1): if dp[j - scaled_w] + value > dp[j]: dp[j] = dp[j - scaled_w] + value selected[j] = selected[j - scaled_w] + [item] # 取总价值最高的结果 max_value = max(dp) best_idx = dp.index(max_value) result = selected[best_idx] print("最优结果:", result) print("总权重:", sum(i[1] for i in result)) print("总价值:", max_value)
内容的提问来源于stack exchange,提问作者Financestudent
相关产品推荐
相关产品推荐

