Addition Chain POJ2248
Thinking
Casual working in this: POJ2248
m iterative deepening dfs, pay attention to pruning
ac Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int a[200] = { 0,1 };
int n;
int dep;
bool dfs(int i) {
if (i > dep) {
if (a[dep] == n)
return true;
else
return false;
}
bool solve[200] = { 0 };
for (int j = i - 1; j >= 1; j--) {
for (int k = j; k >= 1; k--) {
if (a[j] + a[k] <= a[i - 1]) {
break;
}
if (solve[a[j] + a[k]] == false) {
a[i] = a[j] + a[k];
if (dfs(i + 1))
return true;
a[i] = 0;
solve[a[j] + a[k]] = true;
}
}
}
return false;
}
int main() {
while (scanf_s("%d",&n) && n) {
if (n == 1) {
printf("1\n");
continue;
}
dep = 2;
while (!dfs(2)) {
dep++;
}
for (int i = 1; i <= dep; i++) {
printf("%d", a[i]);
if (i != dep)
printf(" ");
else
printf("\n");
}
}
}