应科苑 www.jxuz.net
静音模式
应科电台
应科网络电台 | 感恩节祝福 |分数查询 | 加入收藏 | 设为首页 | 论坛帮助 | 联系我们
打印

我在面试中的一道算法题(1元换零)

我在面试中的一道算法题(1元换零)

给你一元钱,将它换成零钱例如:1元可以由两个五毛的组成、10个一毛的组成,100个一分的组成等...
算法列出所有的可能
我的解法如下:1元=100分 有六种零钱 五角,两角,一角,五分,两分,1 分  统一下单位都用分吧
       当时我的解题思想是这样的.我把100做为一个结点,那么这个节点有六条支路分别是(-i*50),(-i*20),(-i*10),(-i*5),(-i*2),(-i*1).通过这六条支路又可以到达一个新的结点,这个新的结点它也有上面的六条支路再到达下一个结点,如果最后的结点为0说明就找到了一个解.通过上面的分析我们就可以很容易得到一个六叉树.对一树这种数据结构,可以使用递归数法,虽然这种算法效率低,但是代码少而且更易理解.代码如下(C#版):
class Program
    {
        static int[]a=new int[]{50,20,10,5,2,1};
        static int total = 0;
        static void GetResult(string[] result, int Rank, int Remain)
        {
            for (int i = 0; Remain - i * a[Rank] >= 0; i++)
            {
                result[Rank] = i.ToString() + "*" + a[Rank].ToString();
                if (Remain - i * a[Rank] == 0)
                {
                    for (int j = 0; j <= Rank; j++)
                    {
                        Console.Write("{0} ", result[j]);
                    }
                    Console.WriteLine();
                    total++;
                }
                if ((Rank +1<6) && (Remain - i * a[Rank]>0))
                {
                    GetResult(result, Rank + 1, Remain - i * a[Rank]);
                }
            }
        }
        static void Main(string[] args)
        {
            string[] Result = new string[100];
            GetResult(Result, 0, 100);
            Console.WriteLine(total);
        }
}
本帖最近评分记录
  • 安安 应科币 +5 CLASS PROGRAM 2007-11-2 17:14

TOP

自己顶一下

后来我发现这个算法不好对算法进行了改进代码如下(C#版)
using System;
using System.Collections.Generic;
using System.Text;

namespace Dibs
{
    class Program
    {
        static void Main(string[] args)
        {
            // count 为总数 totle 为钱
            int jiao_1, jiao_2, jiao_5, fen_2, fen_5, total, money = 100;
            // 最多有 money / 50 个5角
            for (jiao_5 = 0, total = 0; jiao_5 <= money / 50; jiao_5++)
            {
                // 最多有 (money - jiao_5 * 50) / 20 个两角
                for (jiao_2 = 0; jiao_2 <= (money - jiao_5 * 50) / 20; jiao_2++)
                {
                    // 最多有 (money - jiao_5 * 50 - jiao_2 * 20) / 10 个一角
                    for (jiao_1 = 0; jiao_1 <= (money - jiao_5 * 50 - jiao_2 * 20) / 10; jiao_1++)
                    {
                        // 同理,能看明白上面的就能理解
                        for (fen_5 = 0; fen_5 <= (money - jiao_5 * 50 - jiao_2 * 20 - jiao_1 * 10) / 5; fen_5++)
                        {
                            // 同理,能看明白上面的就能理解
                            for (fen_2 = 0; fen_2 <= (money - jiao_5 * 50 - jiao_2 * 20 - jiao_1 * 10 - fen_5 * 5) / 2; fen_2++, total++)
                            {
                                Console.WriteLine("五角:{0} 两角:{1} 一角:{2} 五分:{3} 两分:{4} 一分:{5}", jiao_5, jiao_2, jiao_1, fen_5, fen_2, money - jiao_5 * 50 - jiao_2 * 20 - jiao_1 * 10 - fen_5 * 5 - fen_2 * 2);
                            }
                        }
                    }
                }
            }

            Console.Write("Total:{0}\n", total);
        }
    }
}
这个方法不是无穷的列举,而是先经过运算算出需要循环的数目,然后再继续走,只有5层的循环,因为最后一个可以计算出来嘿嘿。而且不需要 if 语句的判断,循环的次数就是最后得到的结果,这样效率上面可以提高许多,而且我感觉很好理解,更有可读性。
(发表下主要思想:比如多出一个5角,就等于多出了5个一角,等于多出了10个5分,等于多出了25个二分, 那么就可以减少最后 24次的循环。因为多余的24次以内的循环怎么累加也不可能等于5角,所以这些循环是多余的,可以计算掉。这一切也就同理了。)

TOP

03计算机2班-07研选矿

yc,下次多弄些上来。。哎,不人顶。。

TOP

毕业了还知道回来炫耀一下,哎,余超,我们计算机032班是怕了你了!!!

TOP

小鬼

大致看了一下,第二种好理解一些. 不过这种题拿给我来做的话, 可能那个算法的思路我想不出来,也就是说一时反应不出来1元该怎么分解.

[ 本帖最后由 iwtxokhtd 于 2007-11-2 19:22 编辑 ]

TOP

LZ 是传说中的强人...

现在在哪工作呢? 以后小弟准备跟你混...呵

TOP

我发现语言很难学

尤其是语言是通用的 关键是看思路
怀念我逐渐逝去的青春。当我燃起一根烟,烟雾在嘴巴里进进出出,烟草就在我手中圆寂。

TOP

树立兴趣学习

兴趣也是可以培养的,在读大学以前我的愿望是学习生命科学,因为我的兴趣是生物学,但是高考分数太低,就随便报了我们学校的计算机。其实在读大学以前我对计算机并不了解,更别说什么是编程了,在大一时学习DOS时才对什么是编程有了一定的了解,在那黑黑的屏幕上敲几个简单的命令就能让计算机完成一定的功能,觉得很有意思,但是我的兴趣的来源并不是它能完成这些简单的功能,而是当别人做不出来而自己能完,我觉得很有成就感。但是当我真正学习C语言时这种成就感就没有了,因为我觉得太难了,许多的算法我根本不理解,所以我就开始去背那些算法,我一定要比别人做的好,在背这些算法的过程中我也的确是提高了不少,自己的自信心又重振起来,后来形成了自己的学习方法,不过学习编程的过程的确很辛苦,有好多的算法我都是半夜躺在床上想到的。当然了一旦你有了兴趣,辛苦就不算什么了。编程中有许许多的乐趣,自己去慢慢体会吧

TOP

LZ大哥,你还是饶了我吧,就算我没有来过,还能说什么呢,太牛了!!!

TOP

:) 没仔细看,学弟学妹们好好学习一下吧
我现在最常用的就是改改网络MAC码之类,对代码是一点都没接触了

TOP