最简单的钱币找零问题:这个问题在我们的日常生活中很普遍。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。
贪心分析:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择
当前最好的选择,首先肯定是使用面值最大的钱,比如总共要130元,则第一步肯定是选择100元面值的,第二步选择20元面值的,第三步选择10元面值的。
C++实现:
/***************************************************************************
* @file main.cpp
* @author MISAYAONE
* @date 28 May 2017
* @remark 28 May 2017
* @theme Greedy Algorithm example 1
***************************************************************************/
#include
#include
using namespace std;
//当前的钱库,面值以及对应数量
int single_money[7] = {1,2,5,10,20,50,100};
int number_money[7] = {2,5,0,3,4,0,4};
//每种面值使用贪心算法后需要使用的张数
int count[7] = {};
int total_count;
int tanxin(int money)
{
if (money >= 0) //考虑一下输入规范的问题
{
for (int i = 6; i >= 0; i--)
{
count[i] = min(number_money[i],money/single_money[i]);
money = money - count[i]*single_money[i];
}
return 0;
}
else
{
return money;
}
}
int main(int argc,char** argv)
{
int money;
cout<<"Please input the amount of money:";
cin>>money;
if(! tanxin(money))
{
cout<<"贪心最优结果为:"<
活动选择问题:这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。
贪心分析:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择
由贪心算法,当前最优,目的就是尽可能的是这些活动办的最多,所以这样看来,结束时间越早,办的活动也就尽可能的越多,注意这样可能得到的不是最优解。
C++实现:
/***************************************************************************
* @file main.cpp
* @author MISAYAONE
* @date 28 May 2017
* @remark 28 May 2017
* @theme Greedy Algorithm example 2
***************************************************************************/
#include
#include
using namespace std;
//定义活动的集合,Act 为抽象数据类型名,activity 为实例数据
struct Act
{
int start;
int end;
} activity[100];
int N;//活动的个数
bool cmp(Act a,Act b)
{
return a.end activity[i].end )
{
i = j;
num++;
}
}
return num;
}
int main(int argc,char** argv)
{
//问题的初始化
cout<<"The total num of activities:";
cin>>N;
cout<<"Please input the start and end time of each activity:";
for (int i = 0;i>activity[i].start;
cin>>activity[i].end;
}
//将活动按结束时间排序
sort(activity,activity+N,cmp);
//输出结果
int res = greedy();
cout<<"The maximum activities can be hold is "<