Description
有两个长度为 n n n 的数组 s [ ] s[] s[] 和 b [ ] b[] b[] 。
现在有一个长度为 n n n 的并且只含有 0 和 1 并且至少有一个 1 1 1 的数组 k [ ] k[] k[] ,使得 ∣ ∏ i = 1 n s i k i − ∑ i = 1 n b i k i ∣ |\prod_{i=1}^{n}s_ik_i-\sum_{i=1}^{n}b_ik_i| ∣∏i=1nsiki−∑i=1nbiki∣ 的值最小。
现在请你求出这个最小值。
1 ≤ n ≤ 10 , ∏ i = 1 n s i , ∑ i = 1 n b i ≤ 1 0 9 1\leq n\leq 10,\prod_{i=1}^{n}s_i,\sum_{i=1}^{n}b_i\leq 10^{9} 1≤n≤10,∏i=1nsi,∑i=1nbi≤109 。
Solution
考虑使用 DFS 来解题。
由于 1 ≤ n ≤ 10 1 \leq n \leq 10 1≤n≤10 ,直接 DFS 选择即可。
时间复杂度 O ( 2 n ) O(2^{n}) O(2n) ,具体细节见 代码 部分。
然后这道题目就做完了。
Code
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long int n,a[11],b[11],ans=2147483647;
void dfs(long long int nx,long long int an,long long int bn)
{
if(nx==n)
{
ans=min(ans,abs(an-bn));
return;
}
dfs(nx+1,an,bn);
dfs(nx+1,an*a[nx+1],bn+b[nx+1]);
}
int main()
{
scanf("%lld",&n);
for(long long int i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
}
for(long long int i=1;i<=n;i++)
{
dfs(i,a[i],b[i]);
}
printf("%lld",ans);
return 0;
}