Skip to content

test

原始文件为 cpp 代码,本文是转换后的 Markdown 文件。

#include <bits/stdc++.h>
using namespace std;


int n, maxd;
vector <int> now_have;
int pre[30];
bool vis[1030];

bool dfs(int dep)
{
    // printf("dfs(%d)\n", dep);
    if (dep == maxd) return vis[n];

    int now = now_have.back();
    if (now * pre[maxd - dep] < n) return false;

    for(int i = now_have.size() - 1; i >= 0; --i)
    {
        int temp = now_have[i] + now;
        if (temp < 1030 && !vis[temp])
        {
            now_have.push_back(temp); vis[temp] = true;
            if(dfs(dep+1)) return true;
            now_have.pop_back(); vis[temp] = false;
        }

        temp = now - now_have[i]; 
        if (temp > 0 && !vis[temp])
        {
            now_have.push_back(temp); vis[temp] = true;
            if(dfs(dep+1)) return true;
            now_have.pop_back(); vis[temp] = false;
        }
    }
    return false;
}

void init()
{
    now_have.clear(); now_have.push_back(1);
    pre[0] = 1; for(int i = 1; i < 30; ++i) pre[i] = pre[i-1] << 1;
    memset(vis, false, sizeof(vis)); vis[1] = true;
}

int main()
{
    // freopen("in.txt", "r", stdin);
    while (scanf("%d", &n))
    {
        if(!n) break;
        init();
        for (maxd = 0; ; ++maxd)
        {
            if (dfs(0))
            {
                printf("%d\n", maxd);
                break;
            }
        }
    }
    return 0;
}