1. 程式人生 > >【POJ 2248】 Addition Chain

【POJ 2248】 Addition Chain

target oca space cstring limit names function cst cti

【題目鏈接】

http://poj.org/problem?id=2248

【算法】

搜索剪枝

剪枝1 : 優化搜索順序,從大到小枚舉

剪枝2 : Ai + Aj可能相等,只需搜一次即可

剪枝3 : 通過觀察發現 : m <= 10,可以用叠代加深搜索

【代碼】

#include <algorithm>  
#include <bitset>  
#include <cctype>  
#include <cerrno>  
#include 
<clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include
<list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include
<streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; int i,n,step; int ans[15]; inline bool dfs(int dep) { int i,j; bool visited[110]; if (dep > step) { if (ans[step] == n) return true; else return false; } else { memset(visited,false,sizeof(visited)); for (i = dep - 1; i >= 1; i--) { for (j = i; j >= 1; j--) { if (ans[i] + ans[j] <= ans[i-1]) break; if (ans[i] + ans[j] > n || visited[ans[i]+ans[j]]) continue; visited[ans[i]+ans[j]] = true; ans[dep] = ans[i] + ans[j]; if (dfs(dep+1)) return true; } } return false; } } int main() { while (scanf("%d",&n) != EOF && n) { ans[1] = 1; for (i = 1; i <= 10; i++) { step = i; if (dfs(2)) break; } for (i = 1; i <= step; i++) printf("%d ",ans[i]); printf("\n"); } return 0; }

【POJ 2248】 Addition Chain