贪心算法引申的非常规硬币的凑钱问题

目录

问题:

 初期解决方案:

 二次解决方案:

真·解决方案:

源码下载:


 

问题:

现在有 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个自然数里,有“重要数”和“非重要数”两种࿰

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值