贪心法

贪心法

 

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部 最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

 

两个重要性质:

1)最优子结构。当一个问题的最优包含其子问题的最优解时,称此问题具有最优子结构。问题的最优子是采用贪心法或动态规划法的关键性质 。

2)贪心选择性质。指问题的整体最优解可以通过学习一系列的局部最优的选择,即信心选择来得到。这是贪心法和动态规划法的主要区别。

 

// ActivitySelector.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> using namespace std; class GreedyActivitySelector { private: int n;//活动个数 int *s;//起始时间数组 int *f;//结束时间数组 int *a;//活动 public: GreedyActivitySelector(){} GreedyActivitySelector(int *sa,int *fa,int n); ~GreedyActivitySelector(){delete []a;} void ActivitySelector(); void Print(); }; GreedyActivitySelector::GreedyActivitySelector(int *sa, int *fa, int num) { s=sa; f=fa; n=num; a=new int[n+1];//增加一个位表示结束位,-1表示 } void GreedyActivitySelector::ActivitySelector() { int i=0;//活动的序号 int k=0; a[k]=0;//选择了第一个活动 for(int j=1;j<n;j++) { if(s[j]>=f[i]) { a[++k]=j; i=j;//指向新的活动j } } a[++k]=-1; Print(); } void GreedyActivitySelector::Print() { for(int i=0;i<n-1;i++) { if(a[i]==-1) break; cout<<a[i]<<" "; } cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { int s[]={1,3,0,5,3,5,6,8,8,2,12}; int f[]={4,5,6,7,8,9,10,11,12,13,14}; GreedyActivitySelector as(s,f,12); as. ActivitySelector(); getchar(); return 0; }

你可能感兴趣的:(贪心法)