HDU 1258(Sum It Up)

深搜题,详细见注释。

#include <iostream>
using namespace std;
const int MAXN = 15;

int t, n; //目标值,加数的总数
int flag; //是否有结果
int num[MAXN], answer[MAXN]; //加数数组,结果数组

//深搜
void dfs(int index, int sum, int len)
{ /*index为搜索起点在num数组中的位置,sum为目前answer数组中的和,
	len为answer数组的长度*/
	if (sum == t && len > 0) //找到等式,输出
	{
		flag = 1;
		for (int i = 0; i < len - 1; i++)
			cout << answer[i] << "+";
		cout << answer[len - 1] << endl;
		return;
	}
	int pre = -1; //len位置的上一个值,为了不在同样的位置对同样的值再次搜索
	for (int i = index; i < n; i++)
	{
		if (sum + num[i] <= t && pre != num[i])
		{
			pre = answer[len] = num[i];
			dfs(i + 1, sum + answer[len], len + 1);
		}
	}
}

int main()
{
	while (cin >> t >> n)
	{
		if (t == 0 && n == 0)
			break;

		int total = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> num[i];
			total += num[i];
		}

		cout << "Sums of " << t << ":" << endl;
		if (total < t)
		{
			cout << "NONE" << endl;
			continue;
		}
		flag = 0;
		dfs(0, 0, 0);
		if (flag == 0)
			cout << "NONE" << endl;
	}
	return 0;
}

继续加油。

发布了206 篇原创文章 · 获赞 1 · 访问量 9005

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104780114