C语言贪心算法——找钱
首先,我們先解釋一下貪心算法,貪心算法不是對所有問題都能得到整體最優(yōu)解,但對范圍相當(dāng)
的許多問題能產(chǎn)生整體最優(yōu)解,如最小生成樹問題、圖的單源路徑最短問題等。
貪心算法有兩個(gè)重要的性質(zhì):貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)。
其中,貪心選擇性質(zhì)是指,所求問題的整體最優(yōu)解可以通過一系列局部最優(yōu)的選擇,即貪心選擇來達(dá)到。而最優(yōu)子結(jié)構(gòu)性質(zhì)是當(dāng)一個(gè)問題的最優(yōu)解包含其子問題的最優(yōu)解時(shí),稱此問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。
而我接下來要敘述的問題是貪心算法中較為經(jīng)典的例子,找零錢問題。
在現(xiàn)實(shí)生活中,經(jīng)常遇到找零問題,假設(shè)有數(shù)目不限的面值為20,10,5,1的硬幣。
給出需要找零數(shù),求出找零方案,要求:使用數(shù)目最少的硬幣。
而我們對于此類問題,貪心算法采取的方式是找錢時(shí),總是選取可供找錢的硬幣的最大值。
比如,需要找錢數(shù)為25時(shí),找錢方式為20+5,而不是10+10+5。
下面是C語言實(shí)現(xiàn)問題的解(VC6.0運(yùn)行,代碼如下:)
#include<stdio.h>
#include <windows.h>
?
void greedyMoney(int m[],int k,int n);
?
int main(void)
{
? int money[] = {20,10,5,1};
? int k;
? k = sizeof(money)/sizeof(money[0]);?
? greedyMoney(money,k,25);
? system("PAUSE");
}
?
/*
? m[]:存放可供找零的面值,降序排列?
? ? k:可供找零的面值種類數(shù)?
? ? n:需要找零數(shù)?
*/
void greedyMoney(int m[],int k,int n)
{
? ?int i;
? ?for(i=0;i<k;i++)
? ?{
? ? ? while(n>=m[i] && n>0)
? ? ? {
? ? ? ? ? printf("%d.",m[i]);?
? ? ? ? ? n = n-m[i];
? ? ? }
? ?}?
? ?printf("\n");
? ??
}
需要說明的是,在一些情況下,找零錢問題使用貪心算法并不能得到整體最優(yōu)解,其結(jié)果可能只是最優(yōu)解的很好近似。
比如,如果提供找零的面值是11,5,1,找零15。
使用貪心算法找零方式為11+1+1+1+1,需要五枚硬幣
而最優(yōu)解為5+5+5,只需要3枚硬幣。
總結(jié)
以上是生活随笔為你收集整理的C语言贪心算法——找钱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于单片机定时闹钟设计
- 下一篇: c语言wakeup函数,关于RTC时钟R