题解 | #数组分组#C++ 代码 (本质是考给定一个数组和目标值,能否用数组中的元素组成目标值)

数组分组

http://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

//本质是考给定一个数组和目标值,能否用数组中的元素组成目标值

#include<iostream>
#include<algorithm>
#include<vector>
#include<numeric>
using namespace std;
bool sum_of_target(vector<int>& vec, int size, int target)
{
	if (size == 0 && target != 0)
	{
		return false;
	}
	if (vec[size - 1] == target)
	{
		return true;
	}

	return sum_of_target(vec, size - 1, target - vec[size - 1]) || sum_of_target(vec, size - 1, target);//取或者不取该元素

}
int main()
{
	int n = 0;
	cin >> n;
	vector<int>num;
	for (int i = 0; i < n; i++)
	{
		int temp = 0;
		cin >> temp;
		num.push_back(temp);
	}
	int sum = accumulate(num.begin(), num.end(), 0);
	if (sum % 2 != 0)//注意不能使用(sum%2==1)因为可能为负数-1
	{
		cout << "false" << endl;
	}
	else
	{
		vector<int>five;
		vector<int>three;
		vector<int>other;
		for (int a : num)
		{
			if (a % 5 == 0)
			{
				five.push_back(a);
			}
			else if (a % 3 == 0)
			{
				three.push_back(a);
			}
			else
			{
				other.push_back(a);
			}
		}
		int sum_five = accumulate(five.begin(), five.end(), 0);
		int sum_three = accumulate(three.begin(), three.end(), 0);
		int sum_other = accumulate(other.begin(), other.end(), 0);
		if (sum_five == sum && three.size() == 0 && other.size() == 0)//这时候分为5的倍数数组和空数组,这部分是提交失败之后才发现有这样一个坑
		{
			cout << "true" << endl;
		}
		else
		{
			int target = 0.5*sum - sum_five;
			//cout << target << endl;
			//cout << sum_five << endl;
			sort(other.begin(), other.end());
			int size = other.size();
			if (sum_of_target(other, size, target))
			{
				cout << "true" << endl;
			}
			else
			{
				cout << "false" << endl;
			}
		}

	}
	return 0;
}

全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务