1.基本思想:
贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择。
2.贪心算法的两个性质:
1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到。贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系。
2)最优子结构性质:一个问题的最优解包含其子问题的最优解。
3.贪心算法与动态规划的区别:
动态规划是通过自底向上的方式解决子问题,贪心算法是通过自顶向下的迭代方式做出贪心选择,求解问题的最优解。两共同点是都具有最优子结构性质。
4.最优装载问题:采用重量最轻者先装载的贪心选择策略。
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 const int N = 4; 5 template <class type> 6 void Swap(type &x, type &y){ 7 type temp = x; 8 x = y; 9 y = temp; 10 } 11 void BubleSort(int w[],int t[], int n){ 12 for (int i = 1; i <= n; i++) 13 { 14 t[i] = i; 15 } 16 17 for (int i = 1; i < n; i++) 18 { 19 int temp = i; 20 for (int j =i+1; j <= n; j++){ 21 if (w[temp]>w[j]) 22 { 23 temp = j; 24 Swap(w[i], w[j]); 25 } 26 } 27 Swap(t[i], t[temp]); 28 } 29 } 30 void BestLoad(int w[], int x[],int c, int n){ 31 32 int t[N + 1] = {0};//记录原始索引 33 BubleSort(w, t, N); 34 for (int i = 1; i <= n; i++) 35 { 36 x[i] = 0; 37 } 38 for (int i = 1; i <= n&& w[t[i]] <= c; i++) 39 { 40 x[t[i]] = 1; 41 c -= w[t[i]]; 42 } 43 } 44 int main(){ 45 int c = 50; 46 int w[] = { 0, 20,10,25,15 }; 47 int x[N + 1]; 48 cout << "载重容量为:\n" << c << endl; 49 cout << "物品的重量分别为:" << endl; 50 for (int i = 1; i <= N; i++) 51 { 52 cout << w[i] << " "; 53 } 54 cout << endl; 55 BestLoad(w,x, c, N); 56 cout << "贪心选择结果为:" << endl; 57 for (int i = 1; i <= N; i++) 58 { 59 cout << x[i] << " "; 60 } 61 cout << endl; 62 }
时间: 2024-11-05 16:03:42