贪心算法

--------------------- 
作者:LoisLuo666 
来源:CSDN 
原文:https://blog.csdn.net/LoisLuo666/article/details/79560332 

贪心算法:贪心法顾名思义就是不断贪心的选取当前最优策略的计算方法。

下面介绍几种贪心问题

问题一:货币选择问题

问题描述:分别有1,5,10,50,100元,分别有5,2,2,3,5张纸币。问若要支付k元,则需要多少张纸币?

问题分析:

我们只需要遵循“优先使用面值大的硬币”即可。

1.尽可能多的使用100元(即最大的);

2.余下部分尽可能多的使用50元;

3.余下部分尽可能多的使用10元;

4.余下部分尽可能多的使用5元;

5.余下部分使用1元;

#include <iostream>
#include <algorithm>
using namespace std;
 
const int N=5;   
int Money[N]={5,2,2,3,5};  
int Value[N]={1,5,10,50,100};  
 
int solve(int money){
    int num=0;
    for(int i=N-1;i>0;i--){
        //c为使用纸币的张数,在需要用面值为vaule[i]的张数和已有张数里选取最小的;
        int c=min(money/Value[i],Money[i]);
        money=money-Value[i]*c;        
        num+=c;
    }
    if(money>0){
        num=-1;        
    }
    return num;
}
int main(){
    int money;
    cin>>money;//输入一共需要支付多少钱
    int res=solve(money);
    if(res!=-1){
        cout<<res<<endl;
    }else{
        cout<<"no"<<endl;
    }
    return 0;
 
}
 

 

 

 

第二题:

 

#include <stdio.h>
#include <iostream>
#include <algorithm>
 
using namespace std;
//输入
const int n = 5;
int S[n]={1,2,4,6,8};
int T[n]={3,5,7,9,10};
 
pair<int, int> itv[n];//对工作排序的pair数组
int solve()
{
    //对pair进行字典序比较
    //为了让结束时间早的工作排在前面,把T存入first,把S存入second
    for(int i=0;i<n;i++){
        itv[i].first=S[i];
        itv[i].second=T[i];
    }
    int cnt=0,t=0;
    for(int i=0;i<n;i++){
        if(t<=itv[i].first){
            cnt++;
            t=itv[i].second;
        }
    }
    return cnt;
}
 
int main() {
    int k=solve();
    cout << k<< endl;
    return 0;
}

 

 

第三题:

#include<string>
#include<iostream>
using namespace std;
int main()
{
    //输入

    string S="ACDBCB";    
    string res;
    int a=0,b=S.size()-1;
    while(a<=b){
        if(S[a]<S[b]){
            res.push_back(S[a]);
            a++;
        }else{
            res.push_back(S[b]);
            b--;
        }
    }
    cout<<res<<endl;    
    return 0;
}

 

posted @ 2019-04-01 12:27  Joel_Wang  阅读(580)  评论(0编辑  收藏  举报