描述
每个月初,奶奶都会给小P一个红包。红包里面有一定的钱数n,小P是一个很听话的孩子,所以每天会只花1元或者2元,但周六周日每天花3元(如果不足3元也花,即把剩余的钱都花完)。于是小P产生了疑问,假设每个月有30天,从每月1号开始花钱的话,他能不能花一个月呢,因为到下个月初,奶奶又会发钱咯;如果不能,他会有多少种花钱方法呢?聪明的程序员,帮他解决这个问题吧。
输入
输入有多组测试数据,每组测试数据输入两个整数n和m,分别代表奶奶给小P的钱数和每月1号是星期m(m为7时表示星期日)。1<=n<=1000,1<=m<=7。
输出
每组测试数据输出仅占一行,如果在最省钱的情况下,小P能把钱花到下个月1号,就输出”Happy!”(不包括到本月末刚好花完的情况);否则请输出小P可以花钱的种数
样例输入
5 4
7 2
100 3
样例输出
4
15
Happy!
提示
样例第一组,n为5,m为4,显然不能花到下个月;可以有以下4种花钱方案:
1 1 3
1 2 2
2 1 2
2 2 1
#include<iostream>
using namespace std;
int f(int n,int m)
{
if(n==1)
return 1;
else if( (n==3 || n==2) && (m%7==6 || m%7==0))
return 1;
else if(n==2 && m%7!=6 && m%7!=0)
return 2;
else if(m%7==6 || m%7==0)
return f(n-3,m+1);
else
return f(n-1,m+1)+f(n-2,m+1);
}
int main()
{
//freopen("testin.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if( (m<=4 && m>=1 && n>46) || ( (m==5 || m==7) && n>48) || (m==6 && n>50) )
{
printf("Happy!\n");
continue;
}
printf("%d\n",f(n,m));
}
return 0;
}
递归的应用。注意临界条件。这个题改成递推效率会更高。