/*贪婪法是一个不追求最优解,只希望得到较为满意的解的方法。 因为它省去了为找最优解而穷尽所需的时间,所以贪婪法一般可以快速 得到满意的解。贪婪法在求解过程的每一步都选取一个局部最优的策略, 把问题规模缩小,最后把每一步的结果合并起来形成一个全局解。 */ /*贪婪法的基本步骤: (1)从某个初始解出发 (2)采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到 一部分解,缩小问题规模。 (3)将所有解综合起来 */ //实例 用贪婪法解硬币找零问题 /*假设有一种货币,它的面值为1分,2分,5分和1角的硬币,最少需要多少个硬币来 找出k分钱的零钱。按照贪婪法的思想,需要不断使用面值最大的硬币,如要找零的值 小于最大的硬币值,则尝试第二大的硬币,依次类推。*/ //代码清单: #include<iostream> using namespace std; #define ONEFEN 1 #define TWOFEN 2 #define FIVEFEN 5 #define ONEJIAO 10 int main() { int money; int onefen=0,twofen=0,fivefen=0,onejiao=0; cout<< "输入要找零的钱(以分为单位):" ; cin>>money; //不断尝试每一种硬币 while(money>=ONEJIAO) { onejiao++; money -=ONEJIAO; } while(money>=FIVEFEN) { fivefen++; money -=FIVEFEN; } while(money>=TWOFEN) { twofen++; money -=TWOFEN; } while(money>=ONEFEN) { onefen++; money -=ONEFEN; } //输出结果 cout<< "1角硬币数:"<<onejiao<<endl; cout<< "5分硬币数:"<<fivefen<<endl; cout<< "2分硬币数:"<<twofen<<endl; cout<< "1分硬币数:"<<onefen<<endl; return 0; }