题目描述:
编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true;不满足时返回false。
输入:
第一行是数据个数,第二行是输入的数据
输出:
返回true或者false
输入范例:
4
1 5 -5 1
输出范例:
true
思路:
本题初步理解为两组互相影响的递归,可以通过他们之间的联系将其转换为一组递归。
需要两组数和相等,可以理解为差为0.
往两组数中添加元素就是在他们之间的绝对值上增减。如果数值添加完毕后两组数距离为0,即可判定存在分组满足条件。
牛客网上还有dfs的方法,以后再讨论。
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int sum5;
int sum3;
int dis0;
vector<int> List;
//假设第index-1个数已经分好,分第index个数
bool f(int index,int dis){
if(index==List.size()){
return abs(dis)==dis0;
}
return (f(index+1,dis+List[index])||f(index+1,dis-List[index]));
}
int main()
{
int n;
while(cin>>n){
int t=n;
sum3=sum5=0;
List.clear();
while(t--){
int a;
cin>>a;
if(a%5==0){
sum5+=a;
}else if(a%3==0){
sum3+=a;
}else{
List.push_back(a);
}
}
dis0=abs(sum5-sum3);
if(f(0,0)){
cout<<"true"<<endl;
}else{
cout<<"false"<<endl;
}
}
return 0;
}