P2036 [COCI 2008/2009 #2] PERKET——dfs求最值
题目描述
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有
众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。
输入格式
第一行一个整数
接下来
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。
输入输出样例 #1
输入 #1
1 3 10
输出 #1
7
输入输出样例 #2
输入 #2
2 3 8 5 8
输出 #2
1
输入输出样例 #3
输入 #3
4 1 7 2 6 3 8 4 9
输出 #3
1
说明/提示
数据规模与约定
对于
说明
- 本题满分
分。 - 题目译自 COCI2008-2009 CONTEST #2 PERKET,译者 @mnesia。
题解
#include <iostream> #include <vector> #include <climits> #include <cmath> using namespace std; // 定义食物结构体,包含酸度和苦度 struct food { int suan; int ku; }; int n; vector<food> foods; int ans = INT_MAX; // 深度优先搜索函数,用于遍历所有可能的食材组合 void dfs(int index, int suan, int ku) { // 当遍历完所有食材时 if (index == n) { // 如果至少选择了一种食材 if (suan != 1) { // 计算当前组合的酸度和苦度的绝对差 ans = min(ans, abs(suan - ku)); } return; } // 选择当前食材 dfs(index + 1, suan * foods[index].suan, ku + foods[index].ku); // 不选择当前食材 dfs(index + 1, suan, ku); } int main() { cin >> n; foods.resize(n); // 读取每种食材的酸度和苦度 for (int i = 0; i < n; i++) { cin >> foods[i].suan >> foods[i].ku; } // 从第一种食材开始进行深度优先搜索,初始酸度为 1,初始苦度为 0 dfs(0, 1, 0); // 输出最小的酸度和苦度的绝对差 cout << ans << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了