简单递推就可以了...注意范围要用double #include <stdio.h> #include <string.h> double dp[11][2005]={0}; //dp[i][j] i代表位数,j代表最后一个数字; int main(void) { int n,m; for(int i=0;i<2005;i++) dp[1][i] = 1; for(int i=1;i<11;i++) for(int j=1;j<2005;j++) for(int k=1;k<=j/2;k++) dp[i][j]+=dp[i-1][k]; int ncase ; scanf("%d",&ncase); int count = 0; while(ncase--) { scanf("%d %d",&n,&m); double sum=0.0; // for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) sum+=dp[n][j]; count++; printf("Case %d: n = %d, m = %d, # lists = %.0f/n",count,n,m,sum); } return 0; }