#include<bits/stdc++.h>
using namespace std;
int n;
int a[15],b[15];
int ans=INT_MAX; // 初始化最小差值为一个很大的数,保证能找到最小值
void dfs(int i,int s,int k){
if(i==n){ // 当遍历完所有元素时
if(s==1&&k==0) return;
int dif=abs(s-k);
ans =min(dif,ans);
return; // 结束当前递归调用,回到上一层
}
dfs(i+1,s,k);
dfs(i+1,s*a[i],k+b[i]);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
}
if(n==1){
cout<<abs(a[0]-b[0]);
return 0;
}
dfs(0,1,0);
cout<<ans;
return 0;
}
很重要一点,找了很久才发现,如果 s == 1 && k == 0
,说明一个也没选,这种情况要排除。