题意大概是:知道数的个数n和数通过杨辉三角的方式得到的和sum,求家数的序列,如果有多组输出字典序最小的一组。

通过生成全排列然后比较其和是否为sum

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,sum;
int a[15][15]={{0},{1},{1,1},{1,2,1},{1,3,3,1},{1,4,6,4,1},{1,5,10,10,5,1},{1,6,15,20,15,6,1},{1,7,21,35,35,21,7,1},{1,8,28,56,70,56,28,8,1},{1,9,36,84,126,126,84,36,9,1},{1,10,45,120,210,252,210,120,45,10,1}};//因为n不超过10,可以列举杨辉三角
int num[10]={1,2,3,4,5,6,7,8,9,10};//加数的范围

int main()
{
    cin>>n>>sum;
    do{
        int ans=0;
        for(int i=0;i<n;i++)
        {
            ans+=num[i]*a[n][i];//求当前序列的加数的和ans
        }
        if(ans==sum)break;//当相等时终止循环,因为是生成全排列,所以最早出现的序列就是字典序最小的序列
    }while(next_permutation(num,num+n));//否则一直生成全排列
        for(int i=0;i<n-1;i++)
    {
        cout<<num[i]<<' ';
    }
    cout<<num[n-1]<<endl;


    return 0;

}


 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐