- // ? -- PROBLEM: UVa Online Judge, 529, Addition Chains
- // TLE, IDDFS, Iterative Deepen DFS Search
- #include <iostream>
- #include <vector>
- #include <cstdlib>
- #include <climits>
- #include <cmath>
- using namespace std;
- int acute_count[10000];
- int get_brief_step_limit(int number);
- void find_addition_chain_ids(vector<int> &, int);
- void find_addition_chain(vector<int> &, vector<int> &, int, int);
- int
- main()
- {
- int num = 0;
- while (cin >> num)
- {
- if (num == 0)
- {
- break;
- }
- vector<int> result;
- find_addition_chain_ids(result, num);
- for (int i = 0; i < result.size(); ++i)
- {
- if (i > 0)
- {
- cout << ' ';
- }
- cout << result[i];
- }
- cout << endl;
- }
- return EXIT_SUCCESS;
- }
- int
- get_brief_step_limit(int num)
- {
- if (num == 1)
- {
- return 1;
- }
- else
- {
- if (num & 0x1)
- {
- return get_brief_step_limit(num >> 1) + 2;
- }
- else
- {
- return get_brief_step_limit(num >> 1) + 1;
- }
- }
- }
- void
- find_addition_chain_ids(vector<int> &result, int target)
- {
- int limit = get_brief_step_limit(target);
- for (int i = 1; i <= limit; ++i)
- {
- vector<int> S;
- find_addition_chain(result, S, target, i);
- if (result.size() != 0)
- {
- return;
- }
- }
- }
- void
- find_addition_chain(vector<int> &result,
- vector<int> &S,
- int target,
- int limit)
- {
- if (S.size() >= limit)
- {
- return;
- }
- if (S.size() == 0)
- {
- S.push_back(1);
- if (target == 1)
- {
- result = S;
- return;
- }
- else
- {
- find_addition_chain(result, S, target, limit);
- }
- }
- else
- {
- for (int i = 0; i < S.size(); ++i)
- {
- for (int j = 0; j < S.size(); ++j)
- {
- int next_num = S[i] + S[j];
- if (next_num == target)
- {
- result = S;
- result.push_back(next_num);
- return;
- }
- else if (next_num > target)
- {
- continue;
- }
- else
- {
- S.push_back(next_num);
- int promissing_max =
- ((INT_MAX >> (limit - S.size())) > next_num)?
- (next_num << (limit - S.size())):
- (INT_MAX);
- if (promissing_max >= target)
- {
- find_addition_chain(result, S, target, limit);
- }
- S.pop_back();
- }
- }
- }
- }
- }
- // -- eof --------
Raw Paste