这题可以用DP做,只是这个节都用栈,那就用递归做吧。。 #include <cstdio> using namespace std; int sum; void find( int remain , int max , int times ) { if( times == 0 ) { if( remain == 0 ) ++sum; } else { for( int i = 0 ; i <= max && remain - i >= 0 ; ++i ) find( remain - i , i , times - 1 ); } } int main() { int n; scanf("%d",&n); while( n-- ) { int n1,n2; scanf("%d%d",&n1,&n2); sum = 0 ; find( n1 , n1 ,n2 ); printf("%d/n",sum); } return 0; }