贪心算法
---------------------
作者: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; }