Addition Chain POJ2248

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");
		}
	}
}
Published 28 original articles · won praise 1 · views 1030

Guess you like

Origin blog.csdn.net/qq_45616764/article/details/104382538