深搜題。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 25;
int n; //目標數字
char str[MAXN]; //輸入帶
int len; //輸入帶長度
int ans, flag; //滿足要求的最大和
int tmpPath[MAXN]; //臨時路徑
int tmpIdx;
int path[MAXN]; //最終路徑
int idx;
void DFS(int pos, int sum)
{
if (sum > n)
return;
if (pos == len)
{
if (sum <= n && sum >= ans)
{
if (sum == ans)
flag = 2;
else
{
ans = sum, idx = 0, flag = 1;
for (int i = 0; i < tmpIdx; i++)
path[idx++] = tmpPath[i];
}
}
return;
}
int tmp = 0;
for (int i = pos; i < len; i++)
{
tmp = tmp * 10 + str[i] - '0';
tmpPath[tmpIdx++] = tmp; //存儲路徑
DFS(i + 1, sum + tmp);
tmpIdx--;
}
}
int main()
{
while (~scanf("%d%s", &n, str) && n && str[0] != '0')
{
len = strlen(str);
memset(tmpPath, 0, sizeof(tmpPath));
memset(path, 0, sizeof(path));
tmpIdx = 0, ans = 0, flag = 0;
DFS(0, 0);
if (flag == 0)
cout << "error" << endl;
else if (flag == 2)
cout << "rejected" << endl;
else
{
cout << ans;
for (int i = 0; i < idx; i++)
cout << " " << path[i];
cout << endl;
}
}
return 0;
}
繼續加油。