深搜题,详细见注释。
#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;
}
继续加油。