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?
InputInput 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.
OutputOutput the ways of the Nth student get message.
Sample Input
4 1 4 2 0 0Sample Output
1
3
题意:N个人排成一列,每个人可以向他后最多M个人传递message,当然传递的距离可以小于这个人数,现在问你从第一个人传递消息到最后一个人有多少中方法。
分析:设dp[i]表示消息传递到第i个人有dp[i]个方法,由于方法最远可以传递M个人的距离,所以在第i人前M个人这个范围的人都能将messager传递给第i人,并且他们的方法数也会成为第i个人的一部分
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int val[1001];
int vol[1001];
int dp[1001];
int main()
{
int n,m;
while(cin>>n>>m,n+m){
memset(dp,0,sizeof(dp));
dp[1]=1;
for(int i=2;i<=n;i++){
for(int j=i-1;i-j<=m&&j>0;j--){
dp[i]+=dp[j];
}
}
printf("%d\n",dp[n]);
}
}