贪心算法(内含问题求助)

问题引入:

找零钱问题:
现有面值为壹元,五角和一角的钞票,需要找零一元五角,请问如何分配才能使用数量最少的钞票:
解决方法:从大到小找(这就是贪心算法)
(总是做出当前看来最好的选择——局部最优)
但是,稍微修改以下问题就不能用这个方法了:
现有面值为壹元壹角,五角和一角的钞票,需要找零一元五角,请问如何分配才能使用数量最少的钞票。(若按面值大小找,则需一张壹元壹角,四张一角,共五张,但我们可以明显看出,可以只用三张五角的钞票。)【局限性】

贪心算法:类似于分治策略和动态规划,也是基于子问题思想的策略。
最优子结构性质:

  • 一个问题的最优解包含其子问题的最优解
  • 这是贪心算法/动态结构算法的关键特征。

贪心算法典型应用:

例题:

  • 可绝对贪婪问题-删数
    这也是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;
}

究竟哪里错了啊,百思不得其解!!求大神帮帮看看。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值