#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
,说明一个也没选,这种情况要排除。