[2001年NOIP提高组] 数的划分

[2001年NOIP提高组] 数的划分

  • 分析:根据题意,一个数按要求的组数划分,也就是求这个数被拆解成规定组数有几种可能,为了确保出现过的方案不再重复,可以规定在后面分组中的数必须大于前面分组中的数,x代表上一个出现的数,初始值为1(也就是从1开始循环),以此类推便可达成上述方案,s代表还需要递归多少次才能满足k组,这里要注意s是从k开始,每完成一次递归后s递减,所以当s等于1时递归结束,t代表还有多大的数可以分,初始值就是n,在循环中最大只能进行到t/s次,避免出现因前数过大导致后面的数无法取的情况。
  • #include<iostream>
    #include<cmath> 
    using namespace std;
    int n,k,ans=0;
    void dfs(int x,int s,int t)//前一个数 划分层数 待划分数 
    {
        if(s==1)
        {
            ans++;
            return;
        } 
        for(int i=x;i<=t/s;i++)
        {
            dfs(i,s-1,t-i);//从第x(初值为1)开始 
        }//需要划分的层数每次都-1 待划分的数每次都减这次划分了的数 
    }
    int main()
    {
        cin>>n>>k;
        dfs(1,k,n);//从最大层数k开始 
        cout<<ans;
        return 0;
    }

     

posted @ 2022-08-23 18:46  4lovls  阅读(78)  评论(0)    收藏  举报