0/1背包问题蛮力法代码
时间: 2025-05-10 15:23:59 浏览: 21
以下是一个使用蛮力法求解0/1背包问题的Python代码:
```python
def knapsack_brute_force(values, weights, capacity):
n = len(values)
# 获取所有可能的物品组合(子集)
max_value = 0
best_subset = []
def generate_subsets(index, current_weight, current_value, subset):
nonlocal max_value, best_subset
if current_weight <= capacity and current_value > max_value:
max_value = current_value
best_subset = subset[:]
for i in range(index, n):
if current_weight + weights[i] <= capacity:
subset.append(i) # 将当前物品加入到子集中
generate_subsets(
i + 1,
current_weight + weights[i],
current_value + values[i],
subset
)
subset.pop() # 回溯
generate_subsets(0, 0, 0, [])
return (max_value, best_subset)
# 测试数据
values = [60, 100, 120]
weights = [10, 20, 30]
capacity = 50
result = knapsack_brute_force(values, weights, capacity)
print(f"最大价值为: {result[0]}")
print(f"选择的物品种类索引为: {result[1]}")
```
### 解释:
上述代码的核心思想是通过枚举所有的可能性来找到最优值。具体步骤如下:
1. **定义参数**:`values` 是每个物品的价值列表; `weights` 是每个物品的重量列表; `capacity` 表示背包的最大承载能力。
2. **递归生成子集**:从第一个物品开始,尝试将它放入或不放入背包中,并以此为基础继续考虑剩余的物品。
- 如果某个物品被选入,则更新总重和总价值;
- 否则跳过该物品直接处理下一个物品。
3. **回溯策略**:当遍历完一种组合后返回上一层继续探索其他方案。
这种方法的时间复杂度较高——O(2^n),因为每件商品都有两种状态:“取”与“舍”。因此只适用于小规模的问题实例。
#### 输出结果:
对于测试用例中的输入(`values=[60, 100, 120], weights=[10, 20, 30], capacity=50`),程序会输出最佳解决方案及其对应的物品编号。
---
阅读全文
相关推荐



















