一、对贪心算法的理解
贪心算法总是做出在当前看来是最好的选择,它不依赖于将来所做的选择,也不依赖于子问题的解,它并不从整体最优考虑,它所做的选择只是局部最优解,这就是贪心算法和动态规划的区别,而且,相较于动态规划算法,贪心算法更加简单,效率也更高。
贪心算法有两个基本要素:贪心选择性质和最优子结构性质。贪心选择性质是指每次做出的贪心选择最终会导致问题的整体最优解。最优子结构则是指一个问题的最优解一定包含其子问题的最优解。
二、汽车加油问题
贪心选择策略:若汽车所剩余的汽油可以开到下一站,就不加油。
以下是部分算法代码:
1 void MinPetrolStation(int *a, int n, int k) { 2 int temp = n; 3 int count = 0; 4 for (int i = 1; i <= k + 1; i++) { 5 temp -= a[i]; 6 if (i == k + 1 && temp >= 0) { 7 cout << count << endl; 8 } 9 else if (temp >= 0 && temp - a[i + 1] < 0) { 10 count++; 11 temp = n; 12 } 13 } 14 if (temp < 0) 15 cout << "No Solution!" << endl; 16 }
三、贪心算法学习中遇到的问题和结对编程情况
遇到的主要问题是有时候找不准贪心选择策略,得不到正确的解决办法。主要应对措施是对自己所选择的贪心策略进行验证,看它是否具有贪心选择性质以及最优子结构性质,在对代码进行编译运行验证时,要多测试几组不一样情况的数据,对于题意要深入的去了解,找到一些特殊的例子。就像我和小组成员在处理删数问题时,首先我们就理解错了题目的意思,直接对数组进行排序,然后删去后k位,却忽略了高位最小的贪心选择,导致只对了一个测试点。