加成序列(迭代加深)

迭代加深

170.加成序列

![在这里插入图片描述]( https://img-blog.csdnimg.cn/4ed08a87ab0b45a4a683c55e123f3380.png?x-oss-process=image/watermark ,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFuc2XCtw==,size_20,color_FFFFFF,t_70,g_se,x_16)
样例输入:

5
7
12
15
77
0

样例输出:

1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77

代码模板:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
int 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;
}


int main()
{
    path[0] = 1;
    while (cin >> n, n)
    {
        int k = 1;
        while (!dfs(1, k)) k ++ ;
        for (int i = 0; i < k; i ++ ) cout << path[i] << ' ';
        cout << endl;
    }

    return 0;
}

 

posted @ 2022-03-22 14:50  panse·  阅读(26)  评论(0)    收藏  举报