题目描述:子集和问题的一个实例为<s,t>,其中,s={x1,x2,…xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在s的一个子集s1,使得s1中元素的和等于c。
本题使用回溯法解决
#include<iostream>
#include<stdlib.h>
using namespace std;
#define max 100
int a[max],b[max];
int sum = 0, m, n;//m为目标值,n为集合的大小
void Solve(int k)
{
if (k == n)
{
if (sum == m)//相等时输出一个解
{
cout << "其中一个子集为:";
for (int i = 0; i < n; i++)
if (b[i] != 0)
cout << b[i] << " ";
cout << endl;
return;
}
}
else
{
sum += a[k];
b[k] = a[k];
Solve(k + 1);
sum -= a[k];//回溯时先还原
b[k] = 0;
Solve(k + 1);
}
}
int main()
{
memset(b, 0, sizeof(b));
cout << "请输入集合S元素个数n:";
cin >> n;
cout << "请输入目标值:";
cin >> m;
cout << "请输入集合S元素:";
for (int i = 0; i < n; i++)
cin >> a[i];
Solve(0);
system("PAUSE");
return 0;
}
示例输入输出:
学习中,欢迎交流