贪心算法问题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;
}