洛谷2036
每一次都是有两种选择,这就会使我们联想起树这种结构,每次的两种选择对应着两种情况,那就需要我们分别考虑,运用dfs(深度优先搜索)多次进行递归调用。下面我们用详细的代码和注释来说明,如有不明白的地方,!请私信我,我一定给你讲清楚!
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int N = 30;
int a[N], b[N], n, ans = 10000000;// ans 本身要初始化一个很大的数字,因为我们要找到一个最小值
void dfs(int i, int x, int y)
{
if (i > n)
{
if (x == 1 && y == 0) return;// 如果这个条件成立,那就可能是以下几种情况:
// 1.全不选的情况;
// 2.酸度全是1,而且苦度又是0的情况(题意中已经排除了这种情况)
ans = min(abs(x - y), ans);
return;
}
// 下面就是两种情况,一种是选上下一个食材,另一种是不选,保持原样;
dfs(i + 1, x * a[i], y + b[i]);
dfs(i + 1, x, y);
}
int main()
{
// 想象成一个二叉树,每次都有两种情况,所以只需要每次都考虑从两种情况出发
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i] >> b[i];//以上是基本的输入操作
dfs(1, 1, 0);// 配料编号 酸度 苦度
// 第一个1代表的是第几种食材,第二个1是因为食材的酸度最后是进行相乘计算,所以要是1;
// 最后一个0,因为苦度是相加开始计算,所以要从0开始;
cout << ans;
return 0;
}