解题思路
1.f0,f3,f5分别表示元素总和,3倍数元素和,5倍数元素和,当f0为奇数时直接输出false;在非3及5倍数数组中寻找是否有元素集合和为target = f0 / 2 - f3;使用回溯的思路校验是否有元素集合和为target;
代码
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
bool dfs(vector<int>& v, int i, int target){ //v的集合中是否有元素和为target
if(i == v.size()) return target == 0;
return dfs(v, i + 1, target - v[i]) || dfs(v, i + 1, target); //分两种情况讨论,是否选中v[i]
}
int main(){
int n;
cin >> n;
vector<int> v; //存储既不是3的倍数,又不是5的倍数的元素
int f0 = 0, f3 = 0, f5 = 0;
for(int i = 0; i < n; i++){
int val;
cin >> val;
f0 += val;
if(abs(val) % 5 == 0){
f5 += val;
}
else if(abs(val) % 3 == 0){
f3 += val;
}
else{
v.push_back(val);
}
}
int target = f0 / 2 - f3; //在数组v中寻找是否有元素集合为target
if(abs(f0) % 2 == 1 || !dfs(v, 0, target)){
cout << "false";
}
else{
cout << "true";
}
return 0;
}
京公网安备 11010502036488号