贪心算法

基本模版

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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值