描述
输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。
数据范围:每个数组大小满足 1≤n≤50 1≤n≤50 ,输入的数据大小满足 ∣val∣≤500 ∣val∣≤500
输入描述:
第一行是数据个数,第二行是输入的数据
输出描述:
返回true或者false
示例1
输入:
4 1 5 -5 1
输出:
true
说明:
第一组:5 -5 1 第二组:1
示例2
输入:
3 3 5 8
输出:
false
说明:
由于3和5不能放在同一组,所以不存在一种分法。
代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<int> elsevec;
int n,m,sum3,sum5,dis0;
bool f(int i,int dis){
if(i==elsevec.size()){
return abs(dis)==dis0;
}return (f(i+1,dis+elsevec[i])||f(i+1,dis-elsevec[i])); //**重点**
}
int main(){
while(cin>>n){
sum3=sum5=0;
elsevec.clear();
int t=n;
while(t--){
cin>>m;
if(m%5==0){
sum5+=m;
}else if(m%3==0){
sum3+=m;
}else{
elsevec.push_back(m);
}
}dis0=abs(sum5-sum3);
if(f(0,0)){
cout<<"true"<<endl;
}else cout<<"false"<<endl;
}
return 0;
}