c/c++贪心算法实例

贪心算法问题1(西红柿首富的烦恼):

王多鱼获得了一笔的奖金X,要求购买最少的商品把钱花光,即没有零钱剩下,否则商品会被没收。

输入:

一个整数k:商品的种类(每个种类商品个数不限);

第i类商品的价值a[i];

一个整数m:奖金总额;

输出:

最少商品数量

举例:

输入:

7

1 2 5 10 20 50 100

288

输出:

8

代码:

c++代码实现(贪心算法):

/**王多鱼问题*/
#include <iostream>

using namespace std;

int main()
{
    int k,n,m,cnt=0,a[1000];
    cout << "商品的种类" << endl;
    cin>>k;
    cout << "从小到大输入商品的价值" << endl;
    for(int i=1;i<=k;i++)
        cin>>a[i];
    cout << "输入奖金总额" << endl;
    cin>>m;
    for(int i=k;i>=1;i--){
        if(m>=a[i]){
            n = m/a[i];
            m = m - n*a[i];
            cnt +=n;
            cout<<a[i]<<"元的商品:"<<n<<"个"<<endl;
            if(m==0)
                break;
        }
    }
    cout<<"最少的商品数量:"<<cnt<<endl;
    return 0;
}

测试结果: 

贪心算法问题2(西红柿首富的烦恼升级):

王多鱼获得了一笔的奖金X,要求购买最少的商品把钱花光,即没有零钱剩下,否则商品会被没收。

输入:

一个整数k:商品的种类(每个种类商品个数有限);

第i类商品的价值a[i];

第i类商品的数量b[i];

一个整数m:奖金总额;

输出:

最少商品数量

举例:

输入:

7

1 2 5 10 20 50 100

5 5 5 5 5 5 1

288

输出:

9

代码:

c++代码实现(贪心算法):

/**王多鱼问题*/
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int k,n,m,p,cnt=0,a[1000],b[1000];
    cout << "商品的种类" << endl;
    cin>>k;
    cout << "从小到大输入商品的价值" << endl;
    for(int i=1;i<=k;i++)
        cin>>a[i];
    cout << "依次输入每类商品的数量" << endl;
    for(int i=1;i<=k;i++)
        cin>>b[i];
    cout << "输入奖金总额" << endl;
    cin>>m;
    for(int i=k;i>=1;i--){
        if(m>=a[i]){
            n = m/a[i];
            p = min(n,b[i]);
            m = m - p*a[i];
            cnt +=p;
            cout<<a[i]<<"元的商品:"<<p<<"个"<<endl;
            if(m==0)
                break;
        }
    }
    cout<<"最少的商品数量:"<<cnt<<endl;
    return 0;
}

测试结果:

贪心算法问题3(最多课程问题): 

start_time 8 9 10 12 13
end_time 11 10 15 14 15

一天有n节课,输入起止时间,每节课时间不能冲突,求这一天最多能上多少节课?

输入:

课程起止时间,以‘q’结束;

输出:

最多能上多少节课

#include <iostream>
#include <vector>
#include <cstring>
#include <string.h>
using namespace std;

typedef struct Suject_time{
    int begin_time; //课程开始时间
    int end_time;   //课程结束时间
}suject_time;

int main()
{
    vector<suject_time>Subject;
    string s,p,s1,s2;
    int cnt=1;
    suject_time tmp;
    cout << "输入起止时间,输入'q'字符结束" << endl;
    cin >>s;
    //p = s.substr(s.find(","));
    //s1 = s.substr(s.find_first_not_of(","),s.size()-p.size());
    //s2 = s.substr(s.find_first_of(",")+1,p.size()-1);
    //cout <<s1<< endl;
    //cout <<s2<< endl;
    while(s[0]!='q'){
        p = s.substr(s.find(","));
        s1 = s.substr(s.find_first_not_of(","),s.size()-p.size());
        s2 = s.substr(s.find_first_of(",")+1,p.size()-1);
        tmp.begin_time = stoi(s1);
        tmp.end_time = stoi(s2);
        Subject.push_back(tmp);
        cin>>s;                       //循环输入起止时间
    }
    for(int i=0;i<Subject.size();){
        for(int j=i+1;i<Subject.size();j++){
            if(Subject[j].begin_time>=Subject[i].end_time){
                i =j;
                cnt++;             //计数
                break;
            }
            else
                i++;
        }
    }
    Subject.begin.
    cout<<cnt<<endl;
    return 0;
}

测试:

猜你喜欢

转载自blog.csdn.net/hunzhangzui9837/article/details/83212942