#include <iostream>
using namespace std;
const int N = 12;
int n;
int s[N], b[N];
int ans = 1e9;
void dfs(int u, int acid, int bit)
{
if (u >= n)
{
if (acid == 1 && bit == 0) return;
ans = min(ans, abs(acid - bit));
return;
}
dfs(u + 1, acid * s[u], bit + b[u]);
dfs(u + 1, acid, bit);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) scanf("%d%d", &s[i], &b[i]);
dfs(0, 1, 0);
cout << ans << endl;
return 0;
}
#include <iostream>
using namespace std;
const int N = 12;
int n;
int s[N], b[N];
int ans = 1e9;
void dfs(int u, int acid, int bit)
{
if (u >= n)
{
if (acid == 1 && bit == 0) return;
ans = min(ans, abs(acid - bit));
return;
}
acid *= s[u];
bit += b[u];
dfs(u + 1, acid, bit);
bit -= b[u];
acid /= s[u];
dfs(u + 1, acid, bit);//不选调料
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) scanf("%d%d", &s[i], &b[i]);
dfs(0, 1, 0);
cout << ans << endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
int N,s[12],b[12],mi=2000000001;
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d %d",&s[i],&b[i]);
for(int i=1;i<(1<<N);i++)//因为至少有一种配料,所以从1开始
{
int S=1,B=0;//注意总酸度初始值为1!
for(int j=0;j<N;j++)
if((i>>j)&1)//判断是否为1
{
S*=s[j];
B+=b[j];
}
mi=min(mi,abs(S-B));//别忘了绝对值
}
printf("%d",mi);
return 0;
}
原题链接