- 这个题首先是,咱们可以把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;
}