| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2722 人关注过本帖
标题:蓝桥杯 啤酒与饮料 递归算法
只看楼主 加入收藏
cs1344
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2014-3-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
蓝桥杯 啤酒与饮料 递归算法
#include<stdio.h>
double i=1.9,j=2.3,s=0;

void f(int n,int p,double q)
{     
    if(q<0) return;
    if(q==s&&n<p){//钱为0 且饮料多于啤酒
        printf("啤酒=%d\t饮料=%d",n,p);
        return;
    }
    f(n,p+1,q-i);//买饮料
    f(n+1,p,q-j);//买啤酒
}
int main()
{
    f(0,0,82.3);
    return 0;
}  求解为什么算不出来结果
 
问题  啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。

    我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

[ 本帖最后由 cs1344 于 2015-3-25 21:05 编辑 ]
搜索更多相关主题的帖子: return double include 啤酒 饮料 
2015-03-25 21:04
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:20 
这道题我做过,循环就行了,递归挺麻烦

一片落叶掉进了回忆的流年。
2015-03-25 21:12
cs1344
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2014-3-2
收藏
得分:0 
回复 2楼 诸葛欧阳
递归不麻烦啊 只不过占用时间的确比for要久 问题找出来了 少了一个判断条件
#include<stdio.h>
double i=1.9,j=2.3,s=0;

void f(int n,int p,double q)
{     
    if(q<0) return;
    else if(q==s&&n<p){//钱为0 且饮料多于啤酒
        printf("啤酒=%d\t饮料=%d",n,p);
        return;
    }
    else if(q==s&&n>=p)return;
   
    f(n,p+1,q-i);//买饮料 -1.9
    f(n+1,p,q-j);//买啤酒 -2.3
}
int main()
{
    f(0,0,82.3);
    return 0;
}
2015-03-26 19:28
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
在1至82.3/(1.9+2.3)之间循环。当(82.3-2.3*i)%1.9=0时返回i.

[ 本帖最后由 jklqwe111 于 2015-3-29 17:13 编辑 ]
2015-03-26 19:52
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这个问题由于计算规模很小,所以穷举的方法可以奏效。不过要谈算法,正解应该是解一个二元一次不定方程或一次同余式。应用的是辗转相除法。

重剑无锋,大巧不工
2015-03-27 17:20
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
把数据都乘10再处理

www.qunxingw.wang
2015-03-28 14:36
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
这哪要递归?首先假设买一样多,则各买19瓶,剩下的钱不是饮料价钱的整数倍则往下减一,直到(82.3-n*4.2)/1.9是整数即完成。
2015-03-28 15:02
渣渣渣
Rank: 2
等 级:论坛游民
帖 子:26
专家分:17
注 册:2015-3-23
收藏
得分:0 
就当解方程算就好了
2015-03-28 16:11
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>

#define P 19
#define Q 23
#define M 823

int main(void) {
    int i = 0;
    int s = P + Q, t = 0;

    while((t = M - ++i * s) > 0)
        if(t % P == 0) printf("%d\n", i);

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-03-29 14:18
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int ifmay(double a,double b)
{
    int ix;
    double dy;
    if (b==0) return 0;
    dy=a/b;
    ix=dy;
    ix=ix+(dy-ix>=0.9);
    dy=dy-ix;
    if (dy>0) return !(dy>1e-6);
    else return !(-dy>1e-6);
}
int main()
{
    int n = 0;
    double  p=2.3,y=1.9,a,w=82.3;
    a=p+y;
    while((w-=a) >=1.9)
    {
        n++;
        if(ifmay(w,y))      
        {
          printf("%d\n",n );
          return n;
        }
    }
    printf("err\n");
    return 0;
}
这道题看似简单,做起来有些意料不到的麻烦,如果规整为整数,是比较简单的,就不说这个了,现在假定需要以实数来处理,要怎样实现呢,做的过程出现了很多意想不到的麻烦,主要是如何判断两个实数能够整除,勉强做了一个,基本上能够使用,但在什么范围有效,很难说。各位大神对如何判断两个实数能够整除有何高见。

[ 本帖最后由 jklqwe111 于 2015-3-30 19:43 编辑 ]
2015-03-30 19:01
快速回复:蓝桥杯 啤酒与饮料 递归算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013024 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved