奶奶的红包 bjfu 1124 递归

描述

每个月初,奶奶都会给小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;
} 

递归的应用。注意临界条件。这个题改成递推效率会更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值