小竞赛一。锻炼锻炼(清柳,看看能否置顶) 给定任意数量的现金,给定了0.5元、0.25元、0.10元、0.05元、0.01元的硬币,请写出一个程序(实现的函数行了),计算出换零钱方式的种数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 刚看到消息,置顶数量是有限的,所以如果本贴大家参与热情高的话需要其他几个放几天再把这个放上去。欢迎大家提出类似题目,最好要切合实际应用而且不要把作业贴上来:)关于问题本身,在”问题求解与程序设计“的课程中见过同样的题目,教材上就有实现方式,另外讲greedy method时此类题目有了除此之外还能解决如何是找的硬币数最少的算法。这也是台湾景文技术学院89年大专电脑程序竞赛的题目。 这题目虽然是几十年前的问题,我在MIT的书上看到的。虽然难度不大,但觉得对于递归问题和效率的考虑上却是有很好思考价值,对其他人的提高有一定帮助 将总数为a的现金换成n种硬币的不同方式的数目= 将现金数a换成除了第一种(任意某种就行)之外的所有其他硬币的不同方式的数目+ ...... to0: sqfeiyu(流星雨)题目是求种数! 0.01 0.05 0.1 0.25 0.50.01 1,1 1,5 1,10 1,25 1,500.05 0 1,1 1,2 1,5 1,100.1 0 0 1,1 0 1,50.25 0 0 0 1,1 1,20.5 0 0 0 0 10.01&0.05 0.01&0.05&0.1 0.01&0.05&0.1&0.25 0.01&0.1 0.01&0.25 0.01&0.1&0.25 0.1&0.05&0.25 0.05&0.1 0.05&0.25 … 把提供的钱币进行内部组合,看能由多少个内部组合构成.然后再用模方法做,到时就计算这其中的组合有多少.如0.76=0.5+0.25+0.01但0.25可分为=0.1+0.1+0.05或25个0.01或....逐一分解为不可分为止.可取得不同的数字组合,组合数不相同则组数就++.不知这样做会如何,个人的一个想法,没有去上机验证.还望大家也想想,不一定要递归,程序清晰点小脑袋也会好受些,:<大家多批多提啊 呵呵,大家光说不做,楼主怒了那我就先献丑using System;class MainClass{ static int GetChange(int money, int maxChange) { if (money < 1 || maxChange < 1) { return 0; } if (money < 5 || maxChange < 5) { return 1; } if (money < maxChange) { if (money >= 25) return GetChange(money, 25); if (money >= 10) return GetChange(money, 10); if (money > 5) return GetChange(money, 5); else return 1; } if (money == maxChange) { if (maxChange == 50) { return 1 + GetChange(money, 25); } if (maxChange == 25) { return 1 + GetChange(money, 10); } if (maxChange == 10) { return 1 + GetChange(money, 5); } if (maxChange == 5) { return 2; } } if (maxChange == 50) { return GetChange(money, 25) + GetChange(money - 50, 50); } if (maxChange == 25) { return GetChange(money, 10) + GetChange(money - 25, 25); } if (maxChange == 10) { return GetChange(money, 5) + GetChange(money - 10, 10); } if (maxChange == 5) { return 1+GetChange(money - 5, 5); } else { return 1; } } static void Main() { int money = 0; //以分为单位,比如money=50,表示5角钱。 for (money = 1; money < 51; money++) { Console.WriteLine(money + "分,找钱方式个数为: " + GetChange(money, 50)); } Console.ReadLine(); }} to: Kevin_jun() 你的想法跟Ivony() 差不多的。还是先把它做下来吧!然后大家在讨论改良 先把硬币面值和目标现金数全部转成以分为单位,然后就是简单的动态规划:using System;class Class1{ const int maxCents = 1000000; int[] coins = {50, 25, 10, 5, 1}; int[] a = new int[maxCents]; public int getChange(int cents) { if(cents >= maxCents) throw new ArgumentException("The number of money is too large."); a[0] = 1; for(int i=1; i<=cents; i++) { a[i] = 0; for(int j=0; j<coins.Length; j++) if(i-coins[j]>=0) a[i] += a[i-coins[j]]; } return a[cents]; } } 网络传输性能 鼠标滑过 TextBox 文本框里的内容消失! 读文件换行的小问题~(不是写) 求助:.cs文件中如何使用response.write 如何实现多站数据同步? 通过C#调用EXCEL对象 c#关于静态变量的问题,急! 菜鸟求助~C#如何获取当前用户的宽带账号 [10]哪里有MSIL学习的资料? interface里面的event怎么写? 用XenoCode2005把程序集内容重命名后, 再用XmlSerializer读时出错, 请高手帮助分析一下! 能够对一个dataset执行一些sql语句
关于问题本身,在”问题求解与程序设计“的课程中见过同样的题目,教材上就有实现方式,另外讲greedy method时此类题目有了除此之外还能解决如何是找的硬币数最少的算法。
这也是台湾景文技术学院89年大专电脑程序竞赛的题目。
将现金数a换成除了第一种(任意某种就行)之外的所有其他硬币的不同方式的数目+
......
题目是求种数!
0.01 1,1 1,5 1,10 1,25 1,50
0.05 0 1,1 1,2 1,5 1,10
0.1 0 0 1,1 0 1,5
0.25 0 0 0 1,1 1,2
0.5 0 0 0 0 1
0.01&0.05
0.01&0.05&0.1
0.01&0.05&0.1&0.25
0.01&0.1
0.01&0.25
0.01&0.1&0.25
0.1&0.05&0.25
0.05&0.1
0.05&0.25
…
把提供的钱币进行内部组合,看能由多少个内部组合构成.
然后再用模方法做,到时就计算这其中的组合有多少.
如0.76=0.5+0.25+0.01
但0.25可分为=0.1+0.1+0.05或25个0.01或....
逐一分解为不可分为止.
可取得不同的数字组合,组合数不相同则组数就++.不知这样做会如何,个人的一个想法,没有去上机验证.还望大家也想想,不一定要
递归,程序清晰点小脑袋也会好受些,:<大家多批多提啊
那我就先献丑using System;
class MainClass
{
static int GetChange(int money, int maxChange)
{
if (money < 1 || maxChange < 1)
{
return 0;
}
if (money < 5 || maxChange < 5)
{
return 1;
}
if (money < maxChange)
{
if (money >= 25)
return GetChange(money, 25);
if (money >= 10)
return GetChange(money, 10);
if (money > 5)
return GetChange(money, 5);
else
return 1;
}
if (money == maxChange)
{
if (maxChange == 50)
{
return 1 + GetChange(money, 25);
}
if (maxChange == 25)
{
return 1 + GetChange(money, 10);
}
if (maxChange == 10)
{
return 1 + GetChange(money, 5);
}
if (maxChange == 5)
{
return 2;
}
}
if (maxChange == 50)
{
return GetChange(money, 25) + GetChange(money - 50, 50);
}
if (maxChange == 25)
{
return GetChange(money, 10) + GetChange(money - 25, 25);
}
if (maxChange == 10)
{
return GetChange(money, 5) + GetChange(money - 10, 10);
}
if (maxChange == 5)
{
return 1+GetChange(money - 5, 5);
}
else
{
return 1;
}
}
static void Main()
{
int money = 0; //以分为单位,比如money=50,表示5角钱。
for (money = 1; money < 51; money++)
{
Console.WriteLine(money + "分,找钱方式个数为: " + GetChange(money, 50));
}
Console.ReadLine();
}
}
你的想法跟Ivony() 差不多的。
还是先把它做下来吧!
然后大家在讨论改良
{
const int maxCents = 1000000;
int[] coins = {50, 25, 10, 5, 1};
int[] a = new int[maxCents]; public int getChange(int cents)
{
if(cents >= maxCents)
throw new ArgumentException("The number of money is too large.");
a[0] = 1;
for(int i=1; i<=cents; i++)
{
a[i] = 0;
for(int j=0; j<coins.Length; j++)
if(i-coins[j]>=0) a[i] += a[i-coins[j]];
}
return a[cents];
}
}