贪心算法是指:在对问题求解的时候,总是做出在当前看来最好的选择。也就是说,找出局部最优解。通过求局部最优解得到最终问题的答案。贪心策略的选择必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
贪心问题的解决步骤:
(1)当我们看到这些问题,首先联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选择几个数据,在满足限制值的情况下,期望值最大。
(2)尝试看这个问题能否用贪心问题解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。
(3)举例验证贪心算法产生的结果是不是最优的。
#include<iostream>
#include<string>
#include<vector>
#include <algorithm>
using namespace std;
int getMax(vector<int> can, vector<int> child)
{
sort(can.begin(), can.end());
sort(child.begin(), child.end());
int count = 0;
int j = 0;
for (int i = 0; i < child.size(); i++)
{
while (j < can.size())
{
if (child[i] <= can[j])
{
count++;
j++;
break;
}
j++;
}
}
return count;
}
//从左向右扫描,找出连续的非严格递增串,删除最后一个
string removeKdigits(std::string num, int k)
{
for (int i = 0; i < k; i++)
{
int index = -1;
for (int j = 0; j < num.size()- 1; j++)
{
if (num[j] > num[j + 1])
{
index = j;
break;
}
}
if (index >-1)
{
num.erase(index,1);
}
else
{
num.erase(num.size() - 1, 1);
}
cout << num<<endl;
}
return num;
}
int main()
{
string s = "";
cin >> s;
cout << removeKdigits(s,3);
system("pause");
return 0;
}
class times
{
public:
int star;
int end;
times(int star,int end)
{
this->star = star;
this->end = end;
}
};
bool operator<(times t1,times t2)
{
return t1.end < t2.end;
}
int getmax(vector<times> v)
{
if (v.size() ==0)
{
return 0;
}
int count = 1;
sort(v.begin(), v.end());
for (int i =0 ; i < 6; i++)
{
cout << v[i].star <<"---"<< v[i].end<<" "<<endl;
}
int j = 0;
for (int i =0; i < v.size() ; i++)
{
while ( j < v.size())
{
if (v[i].end<=v[j].star)
{
cout << i<< "-----"<< j<<endl;
count++;
i = j-1;//寻找到当前节点
j++;
break;
}
j++;
}
}
return count ;
}
/*
1 5
2 4
3 5
5 9
6 8
8 10
*/