• 贪心算法


    --------------------- 
    作者: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;
    }
  • 相关阅读:
    git 创建一个空分支
    github page的两种类型
    hexo-theme-next
    github网页
    Linux下的CPU使用率与服务器负载的关系与区别
    mysql数据库优化日志(更)-howyue
    图片延时加载
    jQuery实现页面滚动时顶部动态显示隐藏
    TCP与UDP区别
    记一次网站服务器迁移(my)
  • 原文地址:https://www.cnblogs.com/joelwang/p/10635650.html
Copyright © 2020-2023  润新知