洛谷P2036python用dfs
时间: 2025-04-04 13:03:45 浏览: 28
### 洛谷 P2036 Python DFS 实现
以下是基于提供的参考资料以及题目需求编写的洛谷 P2036 的 Python DFS 解法:
#### 题目分析
该问题的核心在于通过深度优先搜索(DFS)枚举每一种可能的选择组合。对于每一个调料,可以选择放入当前的酸度和苦味计算中,也可以选择跳过它。最终目标是最小化酸度与苦味之间的绝对差值。
#### 代码实现
以下是一个完整的 Python 实现[^2]:
```python
def solve():
n = int(input())
li = []
for _ in range(n):
s, b = map(int, input().split())
li.append((s, b))
def dfs(index, sour_product, bitter_sum):
if index == n:
# 如果至少选了一个调料,则更新最小差异
if sour_product != 1 or bitter_sum != 0:
return abs(sour_product - bitter_sum)
return float('inf') # 若未选择任何调料则返回无穷大
# 选择当前调料的情况
option1 = dfs(index + 1, sour_product * li[index][0], bitter_sum + li[index][1])
# 跳过当前调料的情况
option2 = dfs(index + 1, sour_product, bitter_sum)
return min(option1, option2)
result = dfs(0, 1, 0) # 初始状态:酸度乘积为1,苦味总和为0
print(result)
if __name__ == "__main__":
solve()
```
#### 代码说明
1. **输入处理**: 使用 `input()` 获取调料数量 `n` 和每一组 `(S_i, B_i)` 数据。
2. **递归函数定义** (`dfs`):
- 参数解释:
- `index`: 当前正在考虑的调料索引。
- `sour_product`: 已经选取的调料酸度之积。
- `bitter_sum`: 已经选取的调料苦味之和。
- 基础情况:当所有调料都被遍历完成后,判断是否选择了任意调料。如果没有选择调料,则忽略此分支;否则计算并返回当前酸度与苦味的绝对差值。
- 递归逻辑:分别尝试加入当前调料和不加入当前调料两种可能性,并取两者中的较小值作为结果。
3. **初始调用**: 开始时设置 `sour_product=1`, `bitter_sum=0` 表示尚未选择任何调料。
4. **输出结果**: 打印最终得到的最小绝对差值。
---
###
阅读全文
相关推荐

















