1. 这个题首先是,咱们可以把3的倍数都加起来,然后把5的倍数都加起来。然后取绝对值。让剩下的两组数看看是不是能组成目标绝对值就好。
  2. 关键的算法是剩下的数能不能组成对应的绝对值,画个树就知道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;

}