①不能保证最后的解释最优的
②不能用来求最大或最小解问题
③只能求满足某些约束条件的可行解的范围
【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;
}
}