1 条题解

  • 0
    @ 2023-3-30 20:34:42
    #include <bits/stdc++.h>
    using namespace std;
    const int Maxn=110;
    int n,cnt;//n储存需要到达的数,cnt储存最优解长度
    
    int a[Maxn],ans[Maxn];
    void dfs(int x)//搜索序列第x个
    {
        if(a[x-1]>=n)//如果当前最大项大于或等于需要到达的数
        {
            if(a[x-1]==n && x-1<cnt)//如果等于且项数小于最优解
            {
                cnt=x-1;//更新最优解
                for(int i=1;i<=cnt;i++)
                {
                    ans[i]=a[i];//更新答案
                }
            }
            return ;
        }
        for (int i=x-1;i>=1;i--)//从当前最大项向前搜索相加
        {
            if(a[x-1]+a[i]<=n&& x-1<cnt)//剪枝策略
            {
                a[x]=a[x-1]+a[i];//当前的数更新
                dfs(x+1);//再搜索下一个数字
                a[x]=0;//可不加,调试用
            }
        }
    }
    int main()
    {
        while(cin>>n&&n)
        {
            memset (a,0,sizeof(a));
            a[1]=1;cnt=0x3f3f3f3f;
            dfs(2);//搜索第二个数
            for(int i=1;i<=cnt;i++)
            {
                cout<<ans[i]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
    

    课后总结

    • 1

    「一本通 1.3 例 4」Addition Chains

    信息

    ID
    492
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    60
    已通过
    23
    上传者