贪心算法(又称贪婪算法)是指,在对求解问题,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
例题1:
P1181 数列分段Section I
题目描述
对于给定的一个长度为 NN 的正整数数列 A_iAi ,现要将其分成连续的若干段,并且每段和不超过 MM (可以等于 MM),问最少能将其分成多少段使得满足要求。
输入输出格式
输入格式:
第1行包含两个正整数 N,MN,M ,表示了数列 A_iAi 的长度与每段和的最大值,第 22 行包含 NN 个空格隔开的非负整数 A_iAi ,如题目所述。
输出格式:
一个正整数,输出最少划分的段数。
输入输出样例
输入样例#1:
5 6 4 2 4 5 1
输出样例#1:
3
分析:边读入,边进行,如果大于所输入,便加一个分段
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans =1;
int main()
{
int k = 0;
scanf("%d %d",&n,&m);
while(n--)
{
int a;
scanf("%d",&a);
if(k + a <= m)
{
k += a;
}
else
{
ans ++;
k = a;
}
}
printf("%d",ans);
return 0;
}
P1208 [USACO1.3]混合牛奶 Mixing Milk
题目描述
由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。
Marry乳业从一些奶农手中采购牛奶