①不能保证最后的解释最优的
②不能用来求最大或最小解问题
③只能求满足某些约束条件的可行解的范围
【ACM小白成长撸】--贪婪法解硬币找零问题

question:假设有一种货币,它有面值为1分、2分、5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱。按照贪婪法的思想,需要不断地使用面值最大的硬币。如果找零的值小于最大的硬币值,则尝试第二大的硬币,依次类推。
/*程序的版权和版本声明部分:
**从《C++程序设计思想与方法》(作者:翁惠玉)P61转载
*/

include

using namespace std;

define ONEFEN 1

define TWOFEN 2

define FIVEFEN 5

define ONEJIAO 10

int main(void)
{
int money;
int onefen = 0, twofen = 0, fivefen = 0, onejiao = 0;

cout << "输入要找零的钱(以分为单位):";
cin >> money;

//不断尝试每一种硬币
while(money >= ONEJIAO)
{
    onejiao++;
    money = money - ONEJIAO;
}
while(money >= FIVEFEN)
{
    fivefen++;
    money = money - FIVEFEN;
}
while(money >= TWOFEN)
{
    twofen++;
    money = money - TWOFEN;
}
while(money >= ONEFEN)
{
    onefen++;
    money = money - ONEFEN;
}

cout << "1角硬币数:" << onejiao << endl;
cout << "5分硬币数:" << fivefen << endl;
cout << "2分硬币数:" << twofen << endl;
cout << "1分硬币数:" << onefen << endl;

return 0;

}
贪婪法找零

include

using namespace std;
int denomination[7]={100,50,20,10,5,2,1};

int giveChange(int money,int (*result)[2])
{

int k=0;
int sum=0;
for(int i=0;i<7;i++)
{
    if(money==0) break;
    if(money/denomination[i] > 0)
    {
        sum+=money/denomination[i] * denomination[i];
        result[k][0]=denomination[i];
        result[k][1]=money/denomination[i];
        money=money-sum;
        k++;
        
    }
 
}
return k;

}

int main()
{
int n; //钱总数

while(cin>>n)
{
 
    int result[100][2];
    int k=giveChange(n,result);
    cout<<"需要"<<k<<"张"<<endl;
    for(int i=0;i<k;i++)
    {
        cout<<result[i][0]<<"面币"<<result[i][1]<<"张"<<endl;
    }
    cout<<endl;
}

}