目录
问题:
现在有 1元,2元,5元 这三种硬币若干。那么如何才能用最少的硬币达到需要的金额?
初期解决方案:
上述问题其实很好解决,用最传统的贪心算法即可。在这三种硬币中不断地从大到小循环每次用小等于的面值减去剩余的面值直至完全排列出来即可,代码也很简单
var coins = new int[] { 1, 2, 5 };
for (int i = 0; i < coins.Length; i++) //用冒泡反向排个序
{
for (int j = i + 1; j < coins.Length; j++)
{
if (coins[j] > coins[i])
{
var temp = coins[j];
coins[j] = coins[i];
coins[i] = temp;
}
}
}
var money = 13;//所需金额
var tempMoney = 0;
var temporary = new List<int>();
while (true)
{
foreach (var coin in coins)
{
if (money - tempMoney >= coin)
{
tempMoney += coin;
temporary.Add(coin);
break;
}
}
if (tempMoney == money)
{
break;
}
}
Console.Write("所需最少硬币组和为:");
foreach (var item in temporary)
{
Console.Write(item + " ");
}
输出结果为: 所需最少硬币组和为:5 5 2 1
后来又试了不同的值,结果很完美。并没有出现什么问题。
但贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。理论上应该会有局限才对啊?后来查了下资料发现(看看就成):
我国现行流通使用的人民币共有12种面值,这就是100元、50元、10元、5元、2元(已经很难见到了)、1元、5角、2角、1角、5分、2分、1分。从所发行的人民币中,人们清楚地了解到没有3、4、6、7、8、9这些数的面值。这是为什么呢?原来,在1--10这10个自然数里,有“重要数”和“非重要数”两种