解题思路
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; }