2 solutions

  • 1
    @ 2025-3-27 10:41:51
    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int dfs(int u,int sum,int last)
    {
        if(u==n)
        {
            if(sum==0) return 1;
            return 0;
        }
        int res=0;//当前总和
        for(int i=last;i<=sum;i++)
        {
            //当前的方案不需要记录
            res+=dfs(u+1,sum-i,i);
        }
        return res;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>m>>n;
            cout<<dfs(0,m,0)<<endl;//位置,剩余,上一个
        }
        
        return 0;
    }
    
    • 1
      @ 2025-3-21 16:47:57
      #include<bits/stdc++.h>
      using namespace std;
      int f(int m,int n) //m个苹果,n个盘子 
      {
      	if(m==0||n==1) return 1; //m==0表示恰好分完,n==1只有一个盘子 
      	if(m<n) return f(m,m); //m个苹果n个盘子,等价于m个苹果,m个盘子 
      	return f(m,n-1)+f(m-n,n);
      	//有一个空盘子,每个盘子至少一个苹果 
      }
      int main()
      {
      	int t;
      	cin>>t;
      	for(int i=1;i<=t;i++)
      	{
      		int m,n;
      		cin>>m>>n;
      		cout<<f(m,n)<<endl; 
      	}
      	return 0;
      }
      
      • 1

      Information

      ID
      2121
      Time
      1000ms
      Memory
      128MiB
      Difficulty
      5
      Tags
      (None)
      # Submissions
      13
      Accepted
      3
      Uploaded By