Problem Description
一天,刚打完 CF 的 bLue 决定来一场说走就走的旅行,于是他拿出了地图开始制定行程。
在地图上,bLue 和目的地之间可以用一条直线来表示,他自己在坐标为 0 的位置,而目的地在坐标为 n 的位置。
bLue 计划花费 d 天到达目的地,旅途中,他每天只能选择前进 1, 2, 3 或 4 个单位距离,而不能向回走。他想知道有多少种方案能使他恰好花费 d 天到达目的地。
例如:目的地的坐标为 4,计划天数为 3,则 bLue 有 "1, 2, 4", "1, 3, 4", "2, 3, 4" 三种方案。
Input
输入数据有多组(数据组数不超过 10000),到 EOF 结束。
每组数据输入一行,包含 2 个整数 n, d (0 <= n <= 20, 0 <= d < 10^6),分别代表目的地的位置和 bLue 花费的天数。
Output
对于每组数据,输出一行,代表方案数。
Example Input
2 1 2 2 4 2 4 3 5 3
Example Output
1 1 3 3 6
Hint
很简单的动态规划,自行百度,不过要注意他的计划天数,因为blue只能往前走,也就是说当计划天
数大于坐标点时,blue会提前到达,所以没有方案.这点如果不注意会超时.
源代码:
#include<stdio.h>
#include<string.h>
int day;//计划天数
int a[4]={1,2,3,4};//前进距离
int biao;//目的地坐标
int sum;//方法总和
void go(int s,int g)
{
if(g>day||s>biao) return ;
else if(day==g&&biao==s)
{
sum++;
return ;
}
else
{
for(int i=0;i<4;i++)
{
g++;
go(s+a[i],g);
g--;
}
}
}
int main()
{
int i,j;
while(~scanf("%d%d",&biao,&day))
{
if(day>biao)
{
printf("0\n");
continue;
}
sum=0;
go(0,0);
printf("%d\n",sum);
}
return 0;
}