这道题卡了小一会儿.. 一直
TLE
T
L
E
改对后没删输出时间的调试…
不难想到可以限制搜索层数
然后每次用前面的数加起来转移得到一个新的数
然后搜索的时候从大到小搜使其尽快达到 n n <script type="math/tex" id="MathJax-Element-58">n</script>的限制
但是这样子还是过不了
发现一个序列确定之后下一个数的选择方案是已经确定了的
我们可以强制让序列单调递增 这样就省去了很多无用状态
然后就做完了
Codes
#include<bits/stdc++.h>
using namespace std;
const int N = 400 + 10;
int a[N], len, n;
bool dfs(int x) {
if(a[x - 1] == n) return true;
if(x > len) return false;
for(int i = x - 1; i >= 1; -- i)
for(int j = i; j >= 1; -- j) {
if(a[i] + a[j] > n) continue;
if(a[i] + a[j] <= a[x - 1]) break;
a[x] = a[i] + a[j];
if(dfs(x + 1)) return true;
}
return false;
}
int main() {
//freopen("zoj1937.in", "r", stdin);
//freopen("zoj1937.out", "w", stdout);
a[1] = 1, a[2] = 2;
while(scanf("%d", &n) && n) {
if(n == 1) {
puts("1"); continue;
}
if(n == 2) {
puts("1 2"); continue;
}
for(len = 3; ; ++ len)
if(dfs(3)) {
for(int i = 1; i <= len; ++ i)
printf("%d ", a[i]);
break;
}
//cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;
puts("");
}
return 0;
}