问题引入:
找零钱问题:
现有面值为壹元,五角和一角的钞票,需要找零一元五角,请问如何分配才能使用数量最少的钞票:
解决方法:从大到小找(这就是贪心算法)
(总是做出当前看来最好的选择——局部最优)
但是,稍微修改以下问题就不能用这个方法了:
现有面值为壹元壹角,五角和一角的钞票,需要找零一元五角,请问如何分配才能使用数量最少的钞票。(若按面值大小找,则需一张壹元壹角,四张一角,共五张,但我们可以明显看出,可以只用三张五角的钞票。)【局限性】
贪心算法:类似于分治策略和动态规划,也是基于子问题思想的策略。
最优子结构性质:
- 一个问题的最优解包含其子问题的最优解
- 这是贪心算法/动态结构算法的关键特征。
贪心算法典型应用:
- 活动安排问题
这是别人的博客内容,关于这题的。 - 最优装载问题
嗯嗯,戳这里 - 哈夫曼编码
感谢各路大神,不然肯定难弄懂 - 单源最短路径
这里 - 最小生成树
都是c++形式哦 - 多机调度问题
这个讲的细,不过是c语言
这是c++,不过我看不懂
例题:
- 可绝对贪婪问题-删数
这也是c语言
(其中包含关于字符删除的知识点)
删除字符的方法:
1.物理删除:用后面的字符覆盖已删除的字符(效率不高)
2.用数组记录字符的状态,“1”表示对应数字存在,“0”表示对应数字已经删除
3.利用数组,记录来删除字符的下标。
4.数码的方法(这是啥啊,上课没听懂) - 数列极差问题
这些都是我的上课内容,我整理了一下子,其实我还是有些糊涂,概念是懂了,但是,但是题目做不上来啊,老师布置了武松打虎的问题,我贴一下我的代码啊,不知道哪里错了,不晓得有木有人帮帮瞅瞅。
题目描述
因打虎而闻名的武松在 x 年后接到了景阳岗动物园的求助电话:最近我们动物园逃跑了几只老虎,请您把它们抓回来,武松接到电话之后立刻上了山。正当他到半山腰时,突然跳出 n 只猛虎来。每只老虎都有一块虎牌,牌上写的是每一只虎最大拥有的体力,当武松与老虎 pk 时,若老虎的体力先用完,那么老虎就挂了,否则武松就挂了,求武松在挂之前最多能干掉几只老虎?(注:老虎是一只只上的)
输入描述
第一行两个数字 n(老虎的只数,小于 50000), t(武松的体力)。第二行 n 个数字,分别表示每只老虎的体力。所有变量都不超过 long 类型的表示范围
输出描述
一行,最多能干掉的老虎数
样例输入
6 10
1 5 3 2 4 6
样例输出
4
我的代码如下:
#include<iostream>
using namespace std;
const int maxn=100;
void Sort(long n,long w[maxn])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n-i;j++)
if(w[j]>w[j+1])
swap(w[j],w[j+1]);
}
int main()
{
long n,t,w[maxn];
while(cin>>n>>t)
{
for(int i=1;i<=n;i++)
cin>>w[i];
Sort(n,w);
int amount=0;
long i;
long c=t;//武松的体力
for(i=1;i<=n;i++)
{
if(c>0)
{
amount++;
c=c-w[i];
}
}
cout<<amount<<endl;
}
return 0;
}
究竟哪里错了啊,百思不得其解!!求大神帮帮看看。