基本模版
Greedy(C) //C是问题的输入集合即候选集合
{
S={ }; //初始解集合为空集
while (not solution(S)) //集合S没有构成问题的一个解
{
x=select(C); //在候选集合C中做贪心选择
if feasible(S, x) //判断集合S中加入x后的解是否可行
S=S+{x};
C=C-{x};
}
return S;
零钱找零问题
钱币找零问题:这个问题在我们的日常生活中很普遍。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币
#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 num[7] = {};
int total_count;
int greedy(int money){
if(money>=0){
for(int i=6;i>0;i--){
num[i]=min(number_money[i], money/single_money[i]);
money=money-num[i]*single_money[i];
}
return 0;
}
return money;
}
int main(){
int money;
cin>>money;
if(!greedy(money)){
cout<<"100r "<<num[6]<<endl;
cout<<"50r "<<num[5]<<endl;
cout<<"20r "<<num[4]<<endl;
cout<<"10r "<<num[3]<<endl;
cout<<"5r "<<num[2]<<endl;
cout<<"2 "<<num[1]<<endl;
cout<<"1r "<<num[0]<<endl;
}
return 0;
}
活动安排
有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行
#include<iostream>
#include<algorithm>
using namespace std;
struct Art{
int start;
int end;
}activity[100];
int N;//活动个数
bool cmp(Art a,Art b){
return a.end<b.end;
};
int greedy(){
int num=0;
for(int i=0,j=i+1;i<N;i++){
if(activity[j].start>activity[i].end){
i=j;
num++;
}
}
return num;
}
int main(){
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;
}