1. 程式人生 > >貪心之錢幣找零問題

貪心之錢幣找零問題

問題描述:

假設1元、2元、5元、10元、20元、50元、100元的紙幣分別有c0, c1, c2, c3, c4, c5, c6張。現在要用這些錢來支付K元,至少要用多少張紙幣?

問題分析:

用貪心演算法的思想,很顯然,每一步儘可能用面值大的紙幣即可。在日常生活中我們自然而然也是這麼做的。在程式中已經事先將Value按照從小到大的順序排好。

程式碼:

#include<iostream>  
#include<algorithm>  
using namespace std;  
const int N=7;   
int countt[N]={3,0,2,1
,0,3,5}; int value[N]={1,2,5,10,20,50,100}; int main() { int money,fee=0,sum=0; cin>>money; int i=N-1; while( fee != money ) { // cout<< fee + value[i] <<endl; while( fee + value[i] <= money && countt[i] > 0 ) { fee += value[i]; // cout<<fee<<endl;
sum++; } if( fee == money ) { cout<<sum; return 0; } i--; if( i < 0 ) { cout<<"No solution"; return 0; } } }

上面的程式碼用了while來獲取某一面之錢幣所用數量,而下面這個程式碼則直接用了整除的方法,更加簡單。

#include<iostream>  
#include<algorithm>  
using namespace std;  
const int N=7;   
int Count[N]={3,0,2,1,0,3,5};  
int Value[N]={1,2,5,10,20,50,100};  

int solve(int money)   
{  
    int num=0;  
    for(int i=N-1;i>=0;i--)   
    {  
        int c=min(money/Value[i],Count[i]);  
        money=money-c*Value[i];  
        num+=c;  
    }  
    if(money>0) num=-1;  
    return num;  
}  

int main()   
{  
    int money;  
    cin>>money;  
    int res=solve(money);  
    if(res!=-1) cout<<res<<endl;  
    else cout<<"NO"<<endl;  
}