baby00qi
baby00qi
采纳率50%
2016-03-06 13:50 阅读 1.7k
已采纳

C语言 递归,好像跳不出递归循环了,求大神帮忙看看

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

int num_pi=0;
int num_yin=1;
int money = 823;

int fun(int mon);
int main()
{
    fun(0);
    return 0;
 } 
int fun(int mon)
 {
    if(mon > money)
        return 0;
    if(mon == money && num_pi<num_yin){
            printf("%d\n",num_pi);
            return 0;
     }
     num_pi++;
     fun(mon+23);
     num_yin++;
     fun(mon+19);
 }


  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    caozhy 从今以后生命中的每一秒都属于我爱的人 2016-03-06 14:10
     void foo(int beer, int beverage)
    {
        if (beer < 0 || beverage < 0) return;
        if (beer * 23 + beverage * 19 == 823)
        {
            if (beer < beverage)
                printf("%d %d\n", beer, beverage);
        }
        if (beer * 23 + beverage * 19 < 823)
        {        
            foo(beer, beverage + 1);
        }
        else
        {
            foo(beer - 1, beverage);
        }
    }
    int main()
    {
        foo(823 / 23, 0);
    }
    
    点赞 评论 复制链接分享
  • u013596119 u52983610 2016-03-06 14:17

    加多一个条件,会快很多

     #include <iostream>
    int num_pi=0;
    int num_yin=0;
    int money = 823;
    
    int fun(int mon);
    int main()
    {
        fun(0);
        return 0;
     } 
    int fun(int mon)
     {
        if(mon > money||num_pi>num_yin)
            return 0;
        if(mon == money && num_pi<num_yin){
                printf("%d\n",num_pi);
                return -1;
         }
         num_pi++;
         if(fun(mon+23)==-1){
            return -1;
         }
         num_pi--;
         num_yin++;
         if(fun(mon+19)==-1){
            return -1;
         }
         num_yin--;
     }
    
    点赞 1 评论 复制链接分享
  • u013596119 u52983610 2016-03-06 14:07

    貌似算法不怎么好,时间太久

     #include <iostream>
    int num_pi=0;
    int num_yin=0;
    int money = 823;
    
    int fun(int mon);
    int main()
    {
        fun(0);
        return 0;
     } 
    int fun(int mon)
     {
        if(mon > money)
            return 0;
        if(mon == money && num_pi<num_yin){
                printf("%d\n",num_pi);
                return -1;
         }
         num_pi++;
         if(fun(mon+23)==-1){
            return -1;
         }
         num_pi--;
         num_yin++;
         if(fun(mon+19)==-1){
            return -1;
         }
         num_yin--;
     }
    
    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2016-03-06 14:11
    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2016-03-06 14:12

    思路,beer从大到小,beverage从小到大,如果多了就减酒,如果少了,就加饮料。

    点赞 评论 复制链接分享
  • WinsenJiansbomber Jimbo 2016-03-06 17:28

    递归解题有点暴力,需要枚举所有组合,除条件设置排除外。

    点赞 评论 复制链接分享

相关推荐