贪心算法——C++实现经典案例——初级

最简单的钱币找零问题这个问题在我们的日常生活中很普遍。假设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 <iostream>
#include <math.h>
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<<"贪心最优结果为:"<<endl;
		cout<<"100元:"<<count[6]<<"张"<<endl;
		cout<<"50元:"<<count[5]<<"张"<<endl;
		cout<<"20元:"<<count[4]<<"张"<<endl;
		cout<<"10元:"<<count[3]<<"张"<<endl;
		cout<<"5元:"<<count[2]<<"张"<<endl;
		cout<<"2元:"<<count[1]<<"张"<<endl;
		cout<<"1元:"<<count[0]<<"张"<<endl;
	}
	else
	{
		cout<<"Ops, Wrong number~";
	}
	system("pause");
	return 0;
}

活动选择问题:这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。


贪心分析:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择

由贪心算法,当前最优,目的就是尽可能的是这些活动办的最多,所以这样看来,结束时间越早,办的活动也就尽可能的越多,注意这样可能得到的不是最优解。

《贪心算法——C++实现经典案例——初级》


C++实现:

/***************************************************************************  
 *  @file       main.cpp  
 *  @author     MISAYAONE  
 *  @date       28  May 2017  
 *  @remark     28  May 2017   
 *  @theme      Greedy Algorithm example 2   
 ***************************************************************************/  

#include <iostream>
#include <algorithm>
using namespace std;

//定义活动的集合,Act 为抽象数据类型名,activity 为实例数据
struct Act
{
	int start;
	int end;
} activity[100];

int N;//活动的个数
                                                                                                                                                                                                                                                                           
bool cmp(Act a,Act b)
{
	return a.end<b.end;
}

int greedy()
{
	int num=0;
	for (int i=0,j = i+1;i<N;++j)
	{
		if (activity[j].start > 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<N;++i)
	{
		cin>>activity[i].start;
		cin>>activity[i].end;
	}

	//将活动按结束时间排序
	sort(activity,activity+N,cmp);

	//输出结果
	int res = greedy();
	cout<<"The maximum activities can be hold is "<<res;
	system("pause");
	return 0;
}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/misayaaaaa/article/details/72789998
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞