介绍
贪心法,又称贪心算法、贪婪算法、或称贪婪法,是一种在每一步选择中都采取在当前状态
下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。[1]比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优
解。
贪心算法与动态规划的不同在于它每对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
#include
/*************************************************
最大连续子数组和
*************************************************/
//贪心算法解决
int MaxSumOfArray(int *arr,int len)
{
if (arr == NULL || len <= 0)
{
printf("传入参数错误\n");
return -1;
}
int sum = *arr;
int curMax = *arr;
for (int i = 1; i < len; i++)
{
curMax += arr[i];
if (curMax < 0)
{
curMax = 0;
}
else if (curMax>sum)
{
sum = curMax;
}
if (sum < 0) //全是负数的问题
{
for (int i = 0; i < len; i++)
{
if (sum < arr[i])
{
sum = arr[i];
}
}
}
}
return sum;
}
void test()
{
int arr[5] = { -5, -4, -2, -4, -1 };
cout << MaxSumOfArray(arr, sizeof(arr)/sizeof(arr[0]));
}
/***************************************************
分糖果问题:
描述:
为已经站成一排的小朋友分糖果,保证每个小朋
友有一个糖果,并且保证个子比相邻小朋友高的分到的
糖果数多,照这样的分发,至少需要多少糖果。
***************************************************/
int Candy(vector<int>& rat)
{
vector<int>candy(rat.size(), 1);
int sum = 0;
int i = 0;
for (i = 1; i < rat.size(); i++)//先从左向右扫描
{
if (rat[i]>rat[i - 1])
{
candy[i] = candy[i - 1] + 1;
}
}
sum = candy[rat.size() - 1];
for (i = rat.size() - 2; i >= 0; i--)//从右向左扫描
{
if (rat[i] > rat[i + 1] && candy[i]<=candy[i+1])
{
candy[i] = candy[i + 1] + 1;
}
sum += candy[i];
}
return sum;
}
void TestCandy()
{
int array[] = { 4, 2, 6, 8, 5 };
vector<int> vec(array, array + sizeof(array) / sizeof(int));
cout << Candy(vec) << endl;
}
int main()
{
TestCandy();
return 0;
}