Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4388 | Accepted: 2406 | Special Judge |
Description
Input
Output
Sample Input
5 7 12 15 77 0
Sample Output
1 2 4 5 1 2 4 6 7 1 2 4 8 12 1 2 4 5 10 15 1 2 4 8 9 17 34 68 77
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; //Accepted 200K 360MS C++ 965B 2013-04-03 21:19:09 const int N = 100; int num[N], ans[N]; int len = 11;//len为自己定义的搜索深度的上限。 int n; //int length; void dfs(int dep) { if(dep > len) return ; if(num[dep-1] == n) { if(dep < len) { //length = dep; Time Limit Exceeded len = dep; //用搜索到的结果对回溯时可能的结果剪枝 for(int i = 0; i <= dep-1; i++) ans[i] = num[i]; } return; } for(int i = dep-1; i >= 0; i--) { //从后向往前搜,搜索的的技巧。 num[dep] = num[i] + num[dep-1]; if(num[dep] > n) continue;//剪枝 dfs(dep+1); } } void init() { memset(num, 0,sizeof(num)); memset(ans, 0, sizeof(ans)); len = 11;//每次都会改变。 } int main() { while((scanf("%d", &n) != EOF) && n) { num[0] = 1;///the beginning of the search dfs(1); for(int i = 0; i < len-1; i++) { cout << ans[i] << ' '; } cout << ans[len-1] << endl; init(); } }