http://poj.org/problem?id=1664
组合数学题,下面的叙述m=n,m>n时的情况由组合数学可以给出证明,不详细讨论。
# include<iostream> # include<string.h> # include<cmath> using namespace std; # define N 11 # define M 11 int dp[M][N]; int DP(int m, int n) { if(dp[m][n]!=-1) { return dp[m][n]; } else { if(m==1 || n==1) { return 1; } else if(m<n) { dp[m][n]=DP(m,m); } else if(m==n) { dp[m][n]=DP(m,n-1)+1; } else //m>n { dp[m][n]=DP(m,n-1)+DP(m-n,n); } return dp[m][n]; } } int main() { int t,m,n; int i,j,k; cin>>t; for(i=1;i<=t;i++) { cin>>m>>n; memset(dp,-1,sizeof(dp)); cout<<DP(m,n)<<endl; } return 0; }