其实就是整数拆分第一次以为是dfs 代码如下 #include<stdio h=""> int m,n;int ans; void dfs(int pos,int duanshu,int sum) { int i; if(duanshu==n) { if(sum==m) ans++; return ; } for(i=pos;i<=m;i++) { if(i+sum<=m) dfs(i,duanshu+1,sum+i); } } int main() { int d; scanf("%d",&d); while(d--) { ans=0; scanf("%d%d",&m,&n); dfs(0,0,0); printf("%d\n",ans); } return 0; } </stdio> 后来想了下,可以看成枚举和dp来做 dp【i】【j】表示的是有i个苹果放到j个盘子每个盘子都有苹果 则枚举每个盘子再dp即可 #include<iostream> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int main() { int dp[21][21]; int i,j; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(i=1;i<=20;i++) for(j=1;j<=i;j++) { dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; } int lo,m,n; scanf("%d",&lo); while(lo--) { scanf("%d%d",&m,&n); int sum=0; for(i=0;i<=n;i++) { sum+=dp[m][i]; } printf("%d\n",sum); } return 0; } </algorithm></cstring></cstdlib></cmath></iostream>