贪婪法,也叫贪心算法,用于求问题的最优解。而此问题的解决是由一系列阶段组成。
贪婪法在求解过程的每一个阶段都选取一个在该阶段看似最优的解,然后把每一个阶段的结果合并起来形成一个全局解。
贪婪法并不是对所有问题都能得到最优解。
在日常生活中,经常用贪婪法来寻求问题 的解。
如如何把孩子培养成为一个优秀的人才就是一个求最优解的问题,很多家长采用的就是贪婪法:在孩子成长的每一个阶段都让他接受最好的教育。
//贪婪法货币找零 #include <iostream> using namespace std; const int ONEFEN = 1; const int TWOFEN = 2; const int FIVEFEN = 5; const int ONEJIAO = 10; int main() { int money; int onefen = 0, twofen = 0, fivefen = 0, onejiao = 0; cout << "输入要找零的钱(以分为单位):"; cin >> money; if (money >= ONEJIAO) { onejiao = money / ONEJIAO; money %= ONEJIAO; } if (money >= FIVEFEN) { fivefen = 1; money -= FIVEFEN; } if (money >= TWOFEN) { twofen = money / TWOFEN; money %= TWOFEN; } if (money >= ONEFEN) { onefen = 1; } cout << "1角硬币数:" << onejiao << endl; cout << "5分硬币数:" << fivefen << endl; cout << "2分硬币数:" << twofen << endl; cout << "1分硬币数:" << onefen << endl; cin.ignore(); cin.get(); return 0; }
//贪婪法组合最大三位数 #include <iostream> using namespace std; int main() { int num = 0, max = 10, current; for (int digit = 100;digit > 0;digit /= 10) //100,10,1三个循环, //每次循环,都是寻找剩余元素中的最大值 { current = 0; for (int n : {5, 6, 2, 8, 9, 3,7,1}) { if (n > current&&n < max) current = n; } num += digit*current; max = current; //注意这里的max,if里面的判断语句保证了寻找的是剩余的最大值 } cout << num << endl; cin.ignore(); cin.get(); return 0; }