题目链接
http://poj.org/problem?id=2248
分析
因为 n ≤ 100 n \leq 100 n≤100,考虑一下 m m m 的也不会太大,可以用迭代加深搜索。
依次搜索每个位置,尝试其是之前哪两个数的和,从大数开始枚举。
记录下已尝试过的和,防止重复搜索。
AC代码
#include <cstdio>
#include <cstring>
const int maxn = 105;
int n, d, ans[maxn];
int dfs(int now) {
if (now == d) return ans[now] == n;
int vis[maxn];
memset(vis, 0, sizeof(vis));
for (int i = now; i; --i)
for (int j = i; j; --j) {
int k = ans[i] + ans[j];
if (k > n || vis[k] || k <= ans[now]) continue;
ans[now + 1] = k;
if (dfs(now + 1)) return 1;
vis[k] = 1;
}
return 0;
}
int main() {
ans[1] = 1;
while (scanf("%d", &n) == 1 && n) {
d = 1;
while (!dfs(1)) ++d;
for (int i = 1; i <= d; ++i) printf("%d ", ans[i]);
puts("");
}
return 0;
}