前言
思路
迭代加深的思路,就是找最小
我们可以使用深度限制搜索 , 只有在当前层都没有搜索倒答案的时候我们猜开放下一层
对于本题还加了两个优化
code
// Problem: 加成序列
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/172/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define IOS ios::sync_with_stdio(false);
#define CIT cin.tie(0);
#define COT cout.tie(0);
#define ll long long
#define x first
#define y second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),x.end()
#define Fup(i,a,b) for(int i=a;i<=b;i++)
#define Fde(i,a,b) for(int i=a;i>=b;i--)
typedef priority_queue<int,vector<int>,greater<int>> Pri_m;
typedef pair<int,int> pii;
typedef vector<int> VI;
map<int,int> mp;
const int N = 110;
int n,path[N];
bool dfs(int u,int k){
if(u == k) return path[u-1] == n ;
bool st[N] = {0};
//避免重复搜索重复的和
for(int i = u-1;i>=0;i -- )
for(int j=i;j>=0;j--){
int s = path[i]+ path[j];
if(s > n || s <= path[u-1] || st[s]) continue;
st[s] = true;
path[u] = s;
if(dfs(u+1,k)) return true;
}
return false;
}
void solve(){
int k = 1;
while(!dfs(1,k)) k++;
for(int i = 0; i <k ;i ++ ) cout<<path[i]<<" ";
cout<<endl;
}
int main(){
path[0] = 1;
//int t;cin>>t;while(t--)
while(cin>>n,n)
solve();
return 0 ;
}