回溯法求子集元素和问题

问题描述:

给定一个正整数集合X={x1,x2,…,xn}和一个正整数y,设计回溯算法,求集合X的一个子集Y,使得Y中元素之和等于y。

代码实现:

#include
#include
using namespace std;

#define max 100 
int X[max],Y[max];
int sum = 0, y, n;//y为正整数值,n为集合的大小
void Solve(int k)
{
	if (k == n)
	{
		if (sum == y)//相等时输出一个解
		{
			cout << "其中一个子集Y为:";
			for (int i = 0; i < n; i++)
				if (Y[i] != 0)
					cout << Y[i] << " ";
			cout << endl;
			return;
		}
	}
	else
	{
		sum += X[k];
		Y[k] = X[k];
		Solve(k + 1);
		sum -= X[k];//回溯时先还原
		Y[k] = 0;
		Solve(k + 1);
	}
}
int main()
{
	cout << "请输入集合X元素个数n:";
	cin >> n;
	cout << "请输入目标值:";
	cin >> y;
	cout << "请输入集合X元素:";
	for (int i = 0; i < n; i++)
		cin >> X[i];
	Solve(0);
	system("PAUSE");
	return 0;
}

运行结果:

回溯法求子集元素和问题_第1张图片

你可能感兴趣的:(回溯法求子集元素和问题)