题目描述
编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true;不满足时返回false。
输入描述:
第一行是数据个数,第二行是输入的数据
输出描述:
返回true或者false
#include <bits/stdc++.h>
using namespace std;
bool dfs(vector<int> &cnt, vector<bool> &book, int res)
{
if (res == 0) return true;
for (int i = 0; i < cnt.size(); i++)
{
if (!book[i])
{
book[i] = true;
if(dfs(cnt, book, res - cnt[i])) return true;
book[i] = false;
}
}
return false;
}
int main()
{
int n;
while (cin >> n)
{
vector<int> num;
vector<int> cnt;
bool flag=true;
int nu;
for (int i = 0; i<n; i++)
{
cin >> nu;
num.push_back(nu);
}
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
for (int i = 0; i<num.size(); i++)
{
if ((num[i] % 3) == 0)
sum1 += num[i];
else if ((num[i] % 5) == 0)
sum2 += num[i];
else
{
cnt.push_back(num[i]);
sum3 += num[i];
}
}
int len = cnt.size();
int m = abs(sum1 - sum2);
if ((sum3 - m) % 2 != 0)
{
flag = false;
}
else
{
vector<bool> book(len, false);
int sss = (sum3 - m) / 2;
flag = dfs(cnt, book, sss);
}
if(flag)
cout << "true"<< endl;
else
cout<<"false"<<endl;
}
return 0;
}