- 这个题首先是,咱们可以把3的倍数都加起来,然后把5的倍数都加起来。然后取绝对值。让剩下的两组数看看是不是能组成目标绝对值就好。
- 关键的算法是剩下的数能不能组成对应的绝对值,画个树就知道f在什么了。
#include<bits/stdc++.h> using namespace std; int sum5=0, sum3 =0,dis5_3 = 0; vector<int> arr; //判断能否构成 bool f(int i, int dis){ //如果这个数组里都是3,或者是5的倍数(或者是arr中有内容,然后最后判断有没有值等于绝对值) if(i==arr.size()){ return abs(dis) == dis5_3; }else{ return f(i+1, dis+ arr[i]) || f(i+1, dis-arr[i]);//计算数组绝对值是不是有固定数的方法 } } int main(){ int n,x; while(cin>>n){ arr.clear(); sum5=0, sum3 =0; for(int i=0; i< n;i++){ cin>>x; if(x%5==0){//五得倍数 sum5+=x; }else if(x%3==0){//3的倍数 sum3+=x; }else{ arr.push_back(x);//其他数 } } dis5_3 = abs(sum5-sum3); if(f(0,0)){ cout<<"true"<<endl; }else{ cout<<"false"<<endl; } } return 0; }