题目描述:
有 n 个数,你需要把这些数分成两个组,每个数必须在其中一个组里,组可以为空。令第一个组数的和为 s1,第二个组数的和为 s2,求最大的 |s1|−|s2|。
比如现在有4个数:[11,0,−1,−2]
可以这么分组:第一组为[11,−1],第二组为[0,−2],|s1|−|s2|=|11+(−1)|−|0+(−2)|=10−2=8;
也可以这么分组:第一组为[11,0,−1,−2],第二组为空,|s1|−|s2|=8。
可以证明没有分组策略使得 |s1|−|s2| 的值大于8,所以 8 是答案。
由题意可得 在数据较小时可以使用dfs 在数据较大时应该是全部sum
下附代码
#include <bits/stdc++.h>
using namespace std;
long long a[100005], n,maxi=0;
long long f = 0, s = 0;
void dfs(int step){
if(step==n+1){
maxi = max(maxi, abs(f) - abs(s));
return;
}
f += a[step];
dfs(step + 1);
f -= a[step];
s += a[step];
dfs(step + 1);
s -= a[step];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
if(n<=600)
dfs(1);
else
for (int i = 1; i <= n;i++){
maxi += a[i];
}
cout << maxi;
}