1 条题解

  • 0
    @ 2025-5-25 19:31:07

    这里我们假设N=4 当i=0,执行循环第一句,weights[0]=1 ,那么第一行就是weight[0]=1

    当i=1,执行循环第一句,weights[1]=1,那么其实第二行就是第一行拿下来右边加个1

    当i=2,执行循环第一句,weights[2]=1,此时即是把第二行拿下来右边再加一个1

    接着执行第二个for循环,weights[1]=1+1=2,循环结束,那么第三行就是

    当i=3,执行循环第一句,weights[3]=1,此时即是把第三行拿下来右边再加一个1

    接着执行第二个for循环,weights[2]=1+2=3,weights[1]=2+1=3,循环结束,那么第四行就是

    不难发现其实这个算法只要给定N,它就可以计算出第N行的所有数据 原文链接:https://blog.csdn.net/Slatter/article/details/94743997

    
    #include<iostream>
    #include<cstring>                       
    using namespace std; 
    
    int N,sum;
    int weights[10],ans[10],used[11];
    
    int solve(int num,int now)                              
    {
        if(num==N && now==0)   return  1;
        if((num==N && now!=0) || now<0)   return 0;
        for(int i=1;i<=N;i++)
        {
            if(used[i]==0)
            {
                ans[num]=i;
                used[i]=1;
                if(solve(num+1,now-i*weights[num]))    return  1;
                used[i]=0;
            }
        } 
        return 0;   
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>N>>sum;
        for(int i=0;i<N;i++)                 //这个循环其实就是算出杨辉三角的最底层数据
        {                                    //不了解杨辉三角算法可以自己按照该算法一层层画图
            weights[i]=1;                    //有助于理解,确实就这样看是很难懂的
            for(int j=i-1;j>0;j--)           //这个算法非常之精妙!!!
                weights[j] += weights[j-1];     
        }
        memset(used,0,sizeof(used));
        solve(0,sum);
        for(int j=0;j<N;j++)
        {
            if(j!=N-1)
                cout<<ans[j]<<" "; 
            else
                cout<<ans[j]<<endl;  
        }
    }
    
    
    
    • 1

    信息

    ID
    2188
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者