先上题目:
Distribute Message
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1186 Accepted Submission(s): 547
Problem Description
The contest’s message distribution is a big thing in prepare. Assuming N students stand in a row, from the row-head start transmit message, each person can transmit message to behind M personals, and how many ways could row-tail get the message?
Input
Input may contain multiple test cases. Each case contains N and M in one line. (0<=M<N<=30)
When N=0 and M=0, terminates the input and this test case is not to be processed.
When N=0 and M=0, terminates the input and this test case is not to be processed.
Output
Output the ways of the Nth student get message.
Sample Input
4 1
4 2
0 0
Sample Output
1
3
Hint
4 1 : A->B->C->D4 2 : A->B->C->D, A->C->D, A->B->D
上代码:
1 #include <cstdio> 2 #include <cstring> 3 #define MAX 32 4 #define LL long long 5 using namespace std; 6 7 LL dp[MAX]; 8 9 int main() 10 { 11 int n,m; 12 while(scanf("%d %d",&n,&m),(n+m)){ 13 memset(dp,0,sizeof(dp)); 14 dp[1]=1; 15 for(int i=1;i<=n;i++){ 16 for(int j=1;j<=m && i+j<=n;j++){ 17 dp[i+j]+=dp[i]; 18 } 19 } 20 printf("%I64d\n",dp[n]); 21 } 22 return 0; 23 }