贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
经典例题:
一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。输入卖糖果的价钱,输出最少的找零个数。
分析:是找回个数越少越好即找回的面值尽可能大
#include <iostream>
#include<algorithm>
using namespace std;
struct pa //建立结构体,s,e分别为起止时间
{
int s,e;
}a[1000];
int cmp(const pa&a,const pa&b) //定义排序法 设pa中有a,b两组,按开始时间升序排序
{
return a.s<b.s;
if(a.s==b.s) return a.e<b.e;
}
int main()
{
int n,sum,i,j,max;
while(cin>>n)
{
for(i=0;i<n;i++) //输入起止时间
{
cin>>a[i].s>>a[i].e;
}
sort(a,a+n,cmp); //按定义的方法排序
max=0;
for(i=0;i<n-1;i++) //注意!不一定从第一个开始就能看得最多 例:1 25 从第一个数只能看一个
{ 2 4 第二个开始能看两个
sum=1; 3 6 故起点不一定是排序后第一个
for(j=i+1;j<n;j++) 5 7
{
if(a[j].s>=a[j-1].e) sum++; //后一个开始时间在前一个之后,可看,sum++;
}
if(sum>max) max=sum;
}
cout<<max<<endl;
}
return 0;
}


被折叠的 条评论
为什么被折叠?



