每dfs一次更新一次答案,回溯到当前点时不需要更新答案,因为这个点的答案已经在上一轮的dfs中枚举过了
比如 算了 x=1 ,2时,就是计算了只有1+2时的ans,
而回溯到3,并把3还原后,计算的也就是1+2的ans,所以回溯回来以后不用在维护ans
#include <bits/stdc++.h>
#define mod 100003
using namespace std;
int s[11];
int b[11];
int n;
int soar = 1;
int bear;
int ans;
void dfs(int x) { // 表示搜到第几个佐料
if (x > n)
return ;
soar *= s[x];
bear += b[x];
ans = min(ans, abs(soar - bear));
dfs(x + 1);
soar /= s[x];
bear -= b[x];
dfs(x+1);
return ;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i] >> b[i];
}
ans = abs(s[1] - b[1]);
dfs(1);
cout << ans;
}