题解 | #数组分组#
数组分组
https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86
****************************************
注意这两题的区别
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool judge(int i, vector<int>& arr, int sum1, int sum2);
int main() {
/*
我们将5的倍数的数累加(记为第一组),3的倍数的数累加(记为第二组),剩余的数加入数组中。然后我们可以递归处理剩余的数。
对于剩余的数,每次我们可以选择将其加入第一组或者是第二组,加入第一组我们可以记为加,加入第二组我们可以记为减,直到递归到最后我们对数组剩余中这些数的累加减和等于最初5的倍数和3的倍数的和他们的差的绝对值,说明剩余的数是可以填补这个空缺的。
*/
int n;
while (cin >> n) {
vector<int>arr;
int sum3 = 0;
int sum5 = 0;
int rest = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x % 5 == 0) sum5 += x;
else if (x % 3 == 0) sum3 += x;
else arr.push_back(x);
}
if (judge(0, arr, 0, abs(sum5 - sum3)))
cout << "true" << endl;
else
cout << "false" << endl;
}
}
bool judge(int i, vector<int>& arr, int sum1, int sum2) {
if (i == arr.size())
return abs(sum1) == sum2;
else //加放一边,减放另一边,i+1是下一轮操作的下标
//这样就处理了dp难处理负数的情况
//把一个正数放在sum3和把他的相反数放进sum5对于最后求差的帮助是一样的
return judge(i + 1, arr, sum1 + arr[i], sum2) ||
judge(i + 1, arr, sum1 - arr[i], sum2);
}
// 64 位输出请用 printf("%lld")

