贪心算法习题

合集下载

第4章贪心算法习题(免费阅读)

第4章贪心算法习题(免费阅读)
6
算法实现题4-5 程序存储问题
数据输入:
第一行是2 个正整数,分别表示文件个数n和磁带的长 度L。接下来的1 行中,有n个正整数,表示程序存放在磁 带上的长度。
结果输出: 最多可以存储的程序数。
输入示例
6 50
2 3 13 8 80 20 输出示例
5
i 012345
x 2 3 13 8 80 20 7
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
532.00
10
算法实现题4-6 最优服务次序问题
double greedy( vector<int> x) {
int i,n=x.size(); sort(x.begin(),x.end()); for(i=1;i<n;++i)
x[i] += x[i-1]; double t=0; for(i=0;i<n;++i) t+=x[i]; t /= n;
算法实现题4-5 程序存储问题
int greedy( vector<int> x, int m){
int i=0, sum=0, n=x.size();
sort(x.begin(),x.end());
while(i
if(sum <= m) i++;

第4章-贪心算法-习题

第4章-贪心算法-习题
26
算法实现题4-15 套汇问题
while(1){
cin >> n;
if(n == 0) break;
//输入结束
for(i=0; i < n; ++i) cin >> name[i];
数据输入
第1行有2个正整数n和k,表示汽车加满油后可行驶nkm, 且旅途有k个加油站。接下来的一行中,有k+1个整数,表示 第k个加油站与第k-1个加油站之间的距离。第0个加油站表 示出发地,汽车已加满油。第k+1个加油站表示目的地。
结果输出
计算出的最少加油次数。如果无法到达目的地,则输 出”No Solution”。
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
定义:
vector<int> x; 读取数据:
int n; scanf(“%d”, &n); int temp; for (int i=0; i<n; i++){
scanf(“%d”, &temp); x.push_back(temp); }
return t;
}
i 01234567 8 9
x 1 12 33 55 56 99 99 234 812 1000
输入示例 77
输出示例 4
1 2 3 4 5 1 6 6 加油站数

贪心算法练习题

贪心算法练习题

贪心算法1.喷水装置(一)描述现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。

输入第一行m表示有m组测试数据每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。

输出输出所用装置的个数样例输入252 3.2 4 4.5 6101 2 3 1 2 1.2 3 1.1 1 2样例输出25根据日常生活知道,选择半径越大的装置,所用的数目越少。

因此,可以先对半径排序,然后选择半径大的。

另外,当装置刚好喷到矩形的顶点时,数目最少。

此时只要装置的有效喷水距离的和不小于20时,输出此时的装置数目即可。

2.喷水装置(二)时间限制:3000 ms | 内存限制:65535 KB难度:4描述有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。

请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

输入对于每一组输入,输出最多能够安排的活动数量。

每组的输出占一行样例输入221 1010 1131 1010 1111 20样例输出12提示注意:如果上一个活动在T时间结束,下一个活动最早应该在T+1时间开始。

解题思路:这是一个贪心法中选择不相交区间的问题。

先对活动结束时间从小到大排序,排序的同时活动的起始时间也要跟着变化。

而且,结束时间最小的活动一定会安排,不然这段时间就白白浪费了。

后一个活动的起始时间如果比前一个活动的结束时间大,即两个活动没有相交时间,就把这个活动也安排上。

贪心算法_精品文档

贪心算法_精品文档

贪心算法第八章贪心算法一、选择题1用贪心法设计算法的关键是(D)。

A.将问题分解为多个子问题来分别处理B.选好贪心准则C.获取各阶段间的递推关系式D.满足最优性原理2考虑背包问题:n=6,M=10,P(1:6)=(15,59,21,30,60,5),W(1:6)=(1,5,2,3,6,1)。

该问题的最大效益值为(B)。

若把它看着是0、1背包问题,则最大效益值为(C)。

A.101B.110C.115D.120 8。

3#includeintmain(){freopen(\intmoney,1,2,3,4,5,p,d,n,q,h,temp;canf(\temp=money;p=money、1;if(p>0)money-=p1;d=money、2;if(d>0)money-=d2;n=money、3;if(n>0)money-=n3;q=money、4;if(q>0)money-=q4;h=money、5;if(temp==(p1+d2+n3+q)){printf(\printf(\printf(\printf(\printf(\}eleprintf(\return0;}8。

4uingSytem;uingSytem。

Collection。

Generic;uingSytem。

Linq;uingSytem。

Tet;uingSytem。

Threading。

Tak;namepace动态规划解决硬币问题{claProgram{publicclaCoinChange{publictaticvoidmakeChange(int[]value,intvalueKind,intmoney,i nt[]coinUed){coinUed[0]=0;for(intcent=1;cent<=money;cent++){intminCoin=cent;for(intkind=0;kind<valueKind;kind++){}}}}}8。

第六章-贪心算法

第六章-贪心算法

//每堆牌的张数减去平均数
i:=1;j:=n;
while (a[i]=0) and (i<n) do inc(i);
//过滤左边的0
while (a[j]=0) and (j>1) do dec(j);
//过滤右边的0
while (i<j) do
begin
inc(a[i+1],a[i]); a[i]:=0; inc(step); inc(i); while (a[i]=0) and (i<j) do inc(i);
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的: 从 ③ 取4张牌放到④(9 8 13 10)->从③取3张牌放到 ②(9 11 10 10)> 从②取1张牌放到①(10 10 10 10)。 【输入格式】 N(N 堆纸牌,1 <= N <= 100) A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) 【输出格式】 所有堆均达到相等时的最少移动次数。 【样例输入】Playcard.in
输出n;
//删去串首可能产生的无用零
【例6】拦截导弹问题(NOIP1999) 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦
截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每 一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由 于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
因此,贪心不能简单进行,而需要全面的考虑,最后得到证明。
【例3】排队打水问题

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言1. 零钱兑换问题题目描述:给定一些面额不同的硬币和一个总金额,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。

如果没有任何一种硬币组合能够凑出总金额,返回 -1。

贪心策略:每次选择面额最大的硬币,直到凑出总金额或者无法再选择硬币为止。

C语言代码:int coinChange(int* coins, int coinsSize, int amount){int count = 0;for(int i = coinsSize - 1; i >= 0; i--){while(amount >= coins[i]){amount -= coins[i];count++;}}return amount == 0 ? count : -1;}2. 活动选择问题题目描述:有 n 个活动,每个活动都有一个开始时间和结束时间,选择一些活动使得它们不冲突,且能够参加的活动数最多。

贪心策略:每次选择结束时间最早的活动,直到所有活动都被选择或者无法再选择为止。

C语言代码:typedef struct{int start;int end;}Activity;int cmp(const void* a, const void* b){return ((Activity*)a)->end - ((Activity*)b)->end;}int maxActivities(Activity* activities, int n){qsort(activities, n, sizeof(Activity), cmp);int count = 1;int end = activities[0].end;for(int i = 1; i < n; i++){if(activities[i].start >= end){count++;end = activities[i].end;}}return count;}3. 跳跃游戏题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。

贪心算法题库

贪心算法题库

贪心算法是一种在每一步选择中都采取当前情况下的局部最优选择,并希望导致结果是全局最优解的算法。

下面是一些贪心算法的题目和解答:1. 旅行商问题(Travelling Salesman Problem):问题描述:给定一个城市列表和一个距离列表,要求找出一条路径,使得路径上的所有城市都经过,且总距离最短。

贪心算法解法:首先对城市按照距离进行排序,然后从最近的两个城市开始,每次都选择距离当前位置最近的两个城市,直到遍历完所有城市。

由于贪心算法每次选择的都是当前情况下的最优解,因此最终得到的路径总距离是最短的。

2. 背包问题(Knapsack Problem):问题描述:给定一组物品,每个物品都有自己的重量和价值,要求在不超过背包总重量的情况下,如何选择物品使得背包中物品的总价值最大。

贪心算法解法:按照物品的重量对物品进行排序,然后每次选择重量最小的物品,直到背包已满或无物品可选。

由于贪心算法每次选择的都是当前情况下的最优解,因此最终得到的方案总是可以找到一个大于等于当前最优解的方案。

3. 网格找零问题(Currency Change Problem):问题描述:给定一组面值不同的硬币,要求用最少的组合方式从一定金额中找零。

贪心算法解法:首先对硬币面值进行排序,然后每次使用当前面值最小的硬币进行组合,直到金额为零或无硬币可选。

贪心算法在此问题中的思路是每次选择最小的硬币进行使用,这样可以保证找零的最小数量。

以上题目和解答只是贪心算法的一部分应用,实际上贪心算法在许多其他领域也有广泛的应用,例如网页布局优化、任务调度、网络流等等。

贪心算法的优势在于其简单易懂、易于实现,但也有其局限性,例如无法处理一些存在冲突的情况或最优解不唯一的问题。

因此在实际应用中需要根据具体问题选择合适的算法。

c++贪心算法经典例题

c++贪心算法经典例题

c++贪心算法经典例题摘要:一、贪心算法简介1.贪心算法的定义2.贪心算法的特点3.贪心算法适用的问题类型二、C++贪心算法经典例题1.背包问题a.0-1 背包问题b.完全背包问题c.动态背包问题2.最小生成树a.Kruskal 算法b.Prim 算法3.单源点最短路径a.Dijkstra 算法b.Floyd-Warshall 算法4.最长公共子序列a.贪心算法实现b.动态规划实现正文:一、贪心算法简介贪心算法(Greedy Algorithm)是一种求解最优解的方法。

它是在对问题求解时,总是做出在当前看来是最好的选择。

贪心算法并不追求整体最优解,只希望得到较为满意的解。

贪心算法的关键是贪心策略的选择,必须满足无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

贪心算法适用的问题类型包括背包问题、最小生成树、单源点最短路径和最长公共子序列等。

二、C++贪心算法经典例题1.背包问题背包问题(Knapsack Problem)是一种典型的贪心算法问题。

它描述的是有一个背包,有一定的容量,需要装载若干物品,每个物品有一定的价值和重量,要求在不超过背包容量的前提下,如何选择装载物品使得背包中的物品总价值最大。

背包问题可以分为0-1 背包问题、完全背包问题和动态背包问题。

2.最小生成树最小生成树(Minimum Spanning Tree,简称MST)是一种图论中的算法问题。

给定一个加权连通图,求解一个生成树,使得该生成树中所有边的权值之和最小。

最小生成树的经典算法有Kruskal 算法和Prim 算法。

3.单源点最短路径单源点最短路径(Single Source Shortest Path)问题是在一个图中,从源点出发到其他所有顶点的最短路径。

经典算法包括Dijkstra 算法和Floyd-Warshall 算法。

4.最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)问题是求两个序列中最长的公共子序列。

贪心算法经典例题

贪心算法经典例题

贪心算法经典例题贪心算法是一种求解最优问题的算法思想,其核心理念是每一步都选择当前最优的策略,从而达到全局最优解。

贪心算法可以应用于许多经典问题,下面将介绍几个常见的贪心算法经典例题及相关参考内容。

1. 会议室安排问题题目描述:给定一组会议的开始时间和结束时间,求解如何安排会议,使得尽可能多的会议可以在同一时间段内进行。

解题思路:贪心算法可以通过每次选择结束时间最早的会议来求解。

首先将会议按照结束时间排序,选择第一个会议作为首先安排的会议,然后依次选择后续结束时间不冲突的会议进行安排。

相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)2. 零钱兑换问题题目描述:给定一定面额的硬币,求解如何用最少的硬币数量兑换指定金额的零钱。

解题思路:贪心算法可以通过每次选择面额最大且不超过目标金额的硬币来求解。

从面额最大的硬币开始,尽可能多地选择当前面额的硬币,并减去已经选择的硬币金额,直到金额为0。

相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《算法4》第1章:基础(ISBN: 9787302444627)3. 区间调度问题题目描述:给定一组区间,求解如何选择尽可能多的不重叠区间。

解题思路:贪心算法可以通过每次选择结束时间最早的区间来求解。

首先将区间按照结束时间排序,选择第一个区间作为首先选择的区间,然后依次选择后续结束时间不与已经选择的区间重叠的区间进行选择。

相关参考内容:- 《算法导论》第16章:贪心算法(ISBN: 9787115265955)- 《数据结构与算法分析》第13章:贪心算法(ISBN: 9787302483626)4. 分糖果问题题目描述:给定一组孩子和一组糖果,求解如何分配糖果,使得最多的孩子能够得到满足。

解题思路:贪心算法可以通过每次选择糖果最小且能满足当前孩子的糖果来求解。

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题

列举用贪心算法求解的经典问题
1. 零钱兑换问题:给定一些面值不同的硬币和一个金额,要求用最少的硬币凑出这个金额。

2. 最小生成树问题:给定一个无向带权图,要求用最小的权值构建一棵生成树。

3. 背包问题:给定一些物品和一个背包,每个物品有对应的价值和重量,要求在背包容量限制下,选取物品使得总价值最大。

4. 活动安排问题:有若干个活动需要分配一段时间,每个活动有对应的开始时间和结束时间,要求选取尽可能多的活动,使得任两个安排的活动时间不重叠。

5. 单源最短路径问题:给定一个有向带权图和一个起始节点,要求求出从起始节点到其他所有节点的最短路径。

6. 任务调度问题:有若干个需要完成的任务和多个可执行任务的处理器,要求将任务分配给处理器,使得执行总时间最小。

7. 区间覆盖问题:给定一些区间,要求用尽可能少的区间覆盖整个线段。

8. 哈夫曼编码问题:给定一些字符及其对应的出现概率,要求用最短的编码方式表示这些字符。

贪心法例题

贪心法例题

贪心法例题
贪心法是一种常见的算法思想,在解决一些优化问题时被广泛应用。

下面是几个贪心法的例题:
1. 分发糖果
给定一个数组 ratings,表示一群孩子的评分,现在需要给这些孩子分发糖果。

规定每个孩子至少分配到一个糖果,且评分更高的孩子必须得到更多的糖果。

问最少需要准备多少个糖果。

2. 会议室安排
给定一组会议,每个会议有开始时间和结束时间,现在需要在有限的会议室内安排这些会议,使得尽可能多的会议得以举行。

请问最多可以安排多少个会议。

3. 分割回文串
给定一个字符串 s,将其分割成一些子串,使得每个子串都是回文串。

请问最少需要分割多少次。

4. 零钱兑换
给定一组硬币的面值和一个总金额 amount,现在需要用这些硬币来找零。

请问最少需要多少个硬币才能凑出总金额。

以上例题均可以使用贪心法来解决,具体实现方式需要根据题目要求进行调整。

贪心法在实际应用中的效果取决于问题本身的特点,不适用于所有问题。

- 1 -。

贪心算法练习题

贪心算法练习题

贪心算法练习题贪心算法是一种常用的解决问题的思想和方法,它通常用于求解优化问题。

贪心算法的核心思想是:在每一步选择中都采取当前状态下最优的选择,从而希望最终能够达到全局最优。

在实际应用中,贪心算法常用于解决一些分类问题,如最小生成树、最短路径、背包问题等。

下面,将给出一些贪心算法的练习题,帮助读者更好地理解和掌握贪心算法的应用。

1. 零钱兑换问题假设我们有不同面额的硬币,如 1 美元、2 美元、5 美元等,我们希望找零 n 美元的时候,最少需要多少个硬币。

请用贪心算法解决此问题,并给出相应的代码实现。

2. 区间覆盖问题给定一个区间集合,选择尽可能少的区间,使得这些区间的并集能够覆盖全部的区间。

请使用贪心算法解决此问题,并给出相应的代码实现。

3. 活动选择问题给定 n 个活动的开始时间和结束时间,选择尽可能多的不相交的活动。

请使用贪心算法解决此问题,并给出相应的代码实现。

4. 任务调度问题假设我们有 n 个任务和 m 台执行任务的机器,每个任务需要一个单位的时间,在每台机器上只能执行一个任务。

如何安排任务,使得所有任务都能够被执行,并且时间最短。

请使用贪心算法解决此问题,并给出相应的代码实现。

以上是一些常见的贪心算法练习题,通过解决这些问题,读者可以更加深入地理解和掌握贪心算法的应用。

当然,在实际应用中,贪心算法并不是万能的,它只能求解一些特定类型的优化问题,对于其他类型问题的求解可能并不适用。

因此,在使用贪心算法时,需要仔细分析问题的特性,判断是否适用贪心算法,并注意贪心选择的合理性。

通过不断练习和实践,读者可以逐渐掌握贪心算法的应用技巧,提高问题求解的效率和准确性。

最后,希望读者能够善于思考,灵活运用贪心算法解决实际问题,并在实践中不断学习和进步。

贪心算法作为一种常用的解决问题的思想和方法,对于提高算法设计和分析能力具有重要意义。

贪心算法练习题

贪心算法练习题

贪心算法练习题贪心算法1.喷水装置(一)描述现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。

输入第一行m表示有m组测试数据每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。

输出输出所用装置的个数样例输入252 3.2 4 4.5 6101 2 3 1 2 1.2 3 1.1 1 2样例输出25根据日常生活知道,选择半径越大的装置,所用的数目越少。

因此,可以先对半径排序,然后选择半径大的。

另外,当装置刚好喷到矩形的顶点时,数目最少。

此时只要装置的有效喷水距离的和不小于20时,输出此时的装置数目即可。

2.喷水装置(二)时间限制:3000 ms | 内存限制:65535 KB难度:4描述有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。

请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

输入第一行输入一个正整数N表示共有n次测试数据。

每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。

随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。

输出每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。

如果不存在一种能够把整个草坪湿润的方案,请输出0。

样例输入22 8 61 14 52 10 64 56 5样例输出123.会场安排问题描述学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。

java贪心算法几个经典例子

java贪心算法几个经典例子

java贪心算法几个经典例子
1. 零钱兑换问题
给定面额为1、5、10、25的硬币,以及一个需要兑换的金额,问最少需要多少硬币才能兑换成功。

解法:每次选择面额最大的硬币兑换,直到兑换完毕为止。

2. 分糖果问题
有m个糖果,要分给n个孩子,每个孩子至少分到一个糖果,且每个孩子分到的糖果数应尽量相近,求最小的糖果差。

解法:将m个糖果按照大小排序,依次将糖果分给n个孩子,每次将糖果分给最少的孩子。

3. 区间覆盖问题
给定多个区间,问最少需要选多少个区间才能覆盖全集。

解法:每次选择与当前未被覆盖的部分交集最大的区间添加到答案中,直到所有部分被覆盖完毕为止。

4. 任务调度问题
有n个任务需要完成,每个任务需要占用不同的时间,同时每个任务都有一个
最后期限,问如何调度任务才能最大程度地避免超时。

解法:将所有任务按照最后期限排序,依次将任务安排到最后期限之前的最近空闲时间点,尽量将任务时间安排得紧凑。

贪心算法例题

贪心算法例题

贪心算法例题
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。

以下是一个贪心算法的例子:
问题描述:有100个人在一酒吧,一次酒局中大家都决定向其他每个人敬酒,但只有距离较近的人之间才能互敬。

酒局结束后,每人都记录下他们之间互敬了多少次。

现给出所有人的互敬次数,找出互敬次数最多的那个人。

贪心策略:从最多互敬次数的人开始,每次都选择能互敬次数最多的人,直到达到最大互敬次数为止。

具体实现:
1. 首先将所有人的互敬次数存入一个数组中。

2. 从数组中找到互敬次数最多的人,假设其互敬次数为max_times。

3. 从数组中删除所有互敬次数小于max_times的人,因为他们的互敬次数已经确定不会超过max_times。

4. 重复步骤2和3,直到数组为空。

这个贪心算法的例子中,每次选择都是基于当前情况下的最优选择,希望通过这种方式达到全局最优的结果。

c语言贪心算法题目

c语言贪心算法题目

c语言贪心算法题目
问题描述:
给定一个非负整数数组nums,你的任务是通过在数组中选择一些数,使得这些数的和最大,并且所选的数不能相邻。

请编写一个C程序,实现该任务。

函数原型:
int maxSum(int* nums, int numsSize);
输入参数:
- nums: 非负整数数组nums
- numsSize:数组nums的大小
输出:
返回所选数的最大和
示例:
输入:[1,2,3,1]
输出:4
解释:选择索引为0和2的元素,即nums[0]=1和nums[2]=3,它们的和为4,满足选取数的和最大且不相邻的要求。

提示:
1. 贪心算法是一种优化问题的解决方法,它每次都选择当前最优的解,希望通过局部最优解的选择来达到全局最优解。

2. 对于本题,可以使用动态规划的思想来解决。

通过定义一个dp数组,dp[i]表示选择索引为0到i之间的元素,所选数的最大和。

则对于元素nums[i],有两种选择:选或不选。

- 如果选择nums[i],则dp[i] = nums[i] + dp[i-2]
- 如果不选择nums[i],则dp[i] = dp[i-1]
- 因此,对于每个i,我们选择使得dp[i]最大的方案,直到求得dp[numsSize-1],即所选数的最大和。

3. 初始化dp数组时,dp[0]=nums[0],dp[1]=max(nums[0], nums[1]),从第三个元素开始遍历数组即可。

江西科学技术版小学信息技术五年级下册《主题活动:贪心算法》同步练习题附知识点归纳

江西科学技术版小学信息技术五年级下册《主题活动:贪心算法》同步练习题附知识点归纳

江西科学技术版小学信息技术五年级下册《主题活动:贪心算法》同步练习题附知识点归纳一、课文知识点归纳:1. 贪心算法的基本概念:(1)贪心算法是一种求解最优解问题的更简单、更迅速的设计技术。

(2)它以当前情况为基础,根据某个优化测度做出最优选择,而不考虑所有可能的整体情况。

(3)贪心算法通过自顶向下、迭代的方法做出相继的贪心选择,每做一次选择,问题就简化为一个规模更小的子问题。

2. 贪心算法的基本要素:(1)贪心选择性质:整体最优解可通过一系列局部最优解的选择达到,且每次选择不依赖于后续选择。

(2)最优子结构性质:问题的最优解包含其子问题的最优解。

3.贪心算法的步骤:(1)建立数学模型来描述问题。

(2)把求解的问题分成若干个子问题。

(3)对每个子问题求解,得到子问题的局部最优解。

(4)将子问题的局部最优解合成原问题的解。

4.贪心算法的特点:(1)简单易实现,计算效率高。

(2)适用于具有贪心选择性质和最优子结构性质的问题。

(3)得到的解通常是某种意义上的局部最优解,但不一定是全局最优解。

5.贪心算法的应用场景:(1)货币兑换问题(如找零钱问题)。

(2)背包问题(在限制条件下选择最大价值的物品)。

(3)活动选择问题(安排一系列活动使得尽可能多的活动被安排)。

二、同步练习题。

(一)、填空题。

1. 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优__________的选择,从而希望导致结果是全局最好或最优的算法。

2. 在解决背包问题时,如果背包容量为20千克,物品A重5千克价值100元,物品B重10千克价值150元,为了价值最大化,应先放入____________千克的物品。

3. 在活动选择问题中,若有多个活动的时间区间存在冲突,我们通常使用____________算法进行筛选。

(二)、选择题。

1. 下列关于贪心算法的说法,正确的是()。

A. 贪心算法总是能得到全局最优解B. 贪心算法是一种启发式搜索算法C. 贪心算法只适用于特定类型的问题D. 贪心算法不需要考虑问题的整体结构2. 在教室调度问题中,若某间教室在某天的课程安排如下:课程A 9:00-10:00,课程B 9:30-10:30,课程C 10:30-11:30,则能在这间教室连续进行的课程是()。

oj贪心算法题目

oj贪心算法题目

oj贪心算法题目
贪心算法是一种常见的算法思想,它通过每一步的最优选择来达到整体的最优解。

在 OJ (Online Judge) 上也有许多贪心算法题目,比如:
1. 会场安排问题:有 n 个会议需要在同一天举行,每个会议有开始时间和结束时间,同一时间只能举办一个会议,如何安排使得举办的会议最多?
2. 区间选点问题:有 n 个区间,每个区间有左右端点,需要选取尽可能少的点,使得每个区间至少包含一个点,如何选点使得点的个数最少?
3. 分配糖果问题:有 n 个孩子需要分配糖果,每个孩子有一个评分,需要满足以下条件:每个孩子至少分配到一颗糖果,评分较高的孩子应该比评分低的孩子分配到更多的糖果,最少需要分配多少颗糖果?
4. 跳跃游戏问题:给定一个非负整数数组,每个元素代表你在该位置可以跳跃的最大长度,如何判断是否能够到达最后一个位置?
这些题目都可以通过贪心算法来解决,需要根据具体情况选择合适的贪心策略。

- 1 -。

贪心法例题

贪心法例题

贪心法(一)1、纪念品分组(group.pas)【问题描述】元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。

为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。

为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

【输入】输入文件group . in包含n+2行:第1行包括一个整数w,为每组纪念品价格之和的上限。

第2行为一个整数n,表示购来的纪念品的总件数。

第3~n+2行每行包含一个正整数pi(5<=p:<=w),表示所对应纪念品的价格。

【输出】输出文件group.out仅一行,包含一个整数,即最少的分组数目。

【输入输出样例】【限制】50%的数据满足:1<=n<=15100%的数据满足:1<=n<=30000,80<=w<=2002、独木舟(kaj.bas)【问题描述】我们计划组织一个独木舟旅行。

租用的独木舟都是一样的,最多乘两人,而且载重有一个限度。

现在要节约费用,所以要尽可能地租用最少的舟。

你的任务是读入独木舟的载重量,参加旅行的人数以及每个人的体重,计算出所需要的租船数目。

【输入格式】输入文件名为kaj.in,其第一行是w(8O≤w≤200),表示每条独木舟最大的载重量。

第二行是整数n(1≤n≤30000,参加旅行的人数。

接下来的n行,每行是一个整数Ti(5 ≤Ti≤w),表示每个人的重量。

【输出格式】输出文件仅一行,表示最少的租船数目。

【样例输入】1009902020305060708090【样例输出】63.修复牛棚(barn.bas)【问题描述】农夫约翰在一个呈一字排开的牛棚里养了一群牛。

这个牛棚有很多隔间,每个隔间的大小都是一样的。

一个隔间里只能放一头牛。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【样例输入】 独木舟载重量:100 人数:9 体重: 90 20 20 30 50 60 70 80 90
算法分析

基于贪心法,找到一个重量最大的人, 让它尽可能与重量大的人同乘一船。如 此循环直至所有人都分配完毕即可统计 出所需要的独木舟数。
智力大冲浪
【问题描述】
小伟报名参加电视台的智力大冲浪节目。

如果现有工人数now大于第i个月最少需要的 工人数min[i],则需要解雇一部分工人 最佳方案是否一定是解雇(now-min[i])个工

人呢?不一定是的。

例如,对于示例中的数据,依上述方法计算:
第1个月雇佣10人: mincost = mincost + h * (min[i] - now) + s * min[i] = 0+4*10+5*10 = 90 now = 10 (注意:h=4, s=5> now then begin mincost := mincost + h * (min[i] - now); now := min[i]; end;
mincost := mincost + now * s; {显然,这样的雇佣费用支出是最节省的}
怎样在当月工人数多余的情况下确定 解雇方案
本次挑战赛吸引了众多参赛者,主持人为了
表彰大家的勇气,先奖励每个参赛者m元。
先不要太高兴!因为这些钱还不一定都是你 的!接下来,主持人宣布了比赛规则:
问题描述

首先,比赛时间分为n个时段,它又给 出了很多小游戏,每个小游戏都必须在 规定期限 ti 前完成(1<=ti<=n)。 如果一个游戏没能在规定期限前完成, 则要从奖励费m元中扣去一部分钱wi, wi为自然数。不同的游戏扣去的钱数是 不一样的。

由此看出,解雇的人数应比(now-min[i])少 一些,那么少多少呢? 我们采取这样的贪心策略去确定:

尽可能少地解雇工人(Why?),并且,在
工资支出合理的前提下,尽可能使现有工人 数维持在一个最长时间内,以减少雇佣和解 雇的额外支出。

实现的方法是:在min[i]~min[n]间, 按最少需要人数递增的顺序,将月份排 成序列y1,y2,…,yn-i,yn-i+1(其中 i<=yj<=n,1<=j<=n-i+1)。

第2个月维持现有人数不变(Why?),费用总和为
90+5*10=140; 第3个月雇佣1人,工人数增至11,费用总和为:
140+5*11 + 4 = 199
这个答案与样例输出是一致的。 结合上述分析,可以得出本题总的算法框架如下: mincost := 0; now := 0; for i := 1 to n do begin if min[i] > now then 在现有人数不足的情况下,确定第i个月的雇佣方案, 并累计最小费用mincost; else 在现有人数多余的情况下,确定第i个月的解雇方案, 并累计最小费用mincost; end; 输出项目的最小费用mincost;

从第yj个月出发,按照最少需要递减的顺序来检查 min[yj]、min[yj-1]、……,一旦发现第yj月超员(问题: 为什么是倒序检查?能否正序检查?),且这些工人 在第yj+1个月雇佣与第i到第yj月期间解雇的总费用, 比第i到第yj个月连续使用的费用节约,即: (min[yj]<now)and (((f+h<s*(yj+1-i)) and (yj+1<=n)) or ((f<s*(yj+1-i)) and (yj+1>n))) 则在第i个月解雇now-min[yj]个工人,使现有工人数
分析

因为不同的小游戏不能准时完成时,具有不同的扣
款权数,而且是最优解问题,所以,很容易就想到 用贪心法来求解本题。

根据贪心思想,应让扣款数值大的尽量准时完成。 这样,我们就先把这些任务按照扣款的数目进行排 序,把大的排在前面,先进行放臵。

假如罚款最多的一个任务的完成期限是k,我们应该 把它安排在哪个时段完成呢?应该放在第k个时段, 因为放在1~k中的任何一个位臵上时,效果都是一样
贪心算法习题
排队接水
【问题描述】 有n个人在一个水龙头前排队接水。 假如每个人接水的时间为Ti,请编程找 出这n个人排队的一种顺序,使得n个人 的平均等待时间最小。
独木舟
【问题描述】
我们计划组织一个独木舟旅行。租用的独
木舟都是一样的,最多乘两人,而且载重有
一个限度。现在要节约费用,所以要尽可能
地租用最少的舟。你的任务是读入独木舟的 载重量,参加旅行的人数以及每个人的体重, 计算出所需要的租船数目。

问题描述

当然,每个游戏本身都很简单,保证每 个参赛者都能在一个时段内完成,而且 都必须从整时段开始。主持人只是想考 考每个参赛者如何安排组织自己做游戏 的顺序。

作为参赛者,小伟如何赢取最多的钱!
【样例】 输入 初始奖金:10000 游戏个数:7
结束时段:4 2 4 3 1 4 6 罚款金额:70 60 50 40 30 20 10 输出 9950
1.
怎样在当月工人数不足的情况下,确 定雇佣方案; 怎样在当月工人数多余的情况下确定 解雇方案。
2.
怎样在当月工人数不足的情况下,确 定雇佣方案

如果第i个月所需的最少人数min[i]大于 现有工人数now,则需要雇佣工人。 为了尽可能少减少雇佣费用,我们不 妨雇佣(min[i]-now)个工人,使得第i 个月的工人数正好为min[i]。如果 min[i]=now,则维持现有工人数now不 变。

直至计算出n个月的总费用时为止。

问题是,怎样将这笔费用控制在最低水平上?
问题分析

设mincost表示最小费用和,初始时, mincost=0;now表示现有工人数,初始时, now=0;min[i]表示第i个月所需要的最少工人
数(1<=I<=n);n表示月数,f表示解雇费用,
s表示工资,h表示雇佣费用。那么,我们需 要解决下面的两个问题:


问题:贪心策略在上述算法框架中是如 何发挥作用的?其作用方式有何特点? 可以给我们带来哪些启发?特别地,对 于举一反三地应用贪心法解题有哪些启 发?
=141+4*2+5*11 = 204 now = 11

显然,该雇佣计划的总费用(204)并 不是最少的,因为如果第2个月不解雇 1人,仍维持10人,第3个月再雇佣1人, 这种情况下的总费用为(4*10+5*10) +(5*10)+(4*1+5*11)=90+50+59=199, 即为样例输出。
变为min[yj],否则,维持现有工人数不变。
算法思想如下:
在min[i]~min[n]间,按最少需要人数递增的顺序,将月份排成 y1,…,yn-i+1; for j := n – i downto 1 do {思考:为何要倒推?} if (min[yj]<now) and ((f+h*ord(yj+1<=n)<s*(yj+1 - i)) then
【输入】
输入文件含有三行。第一行为月数n(不超过12)。 第二行含有雇佣一个工人的费用、一个工人的工资 和解雇一个工人的费用(<=100)。第三行含n个数, 分别表示每月最少需要的工人数(<=1000)。每个 数据之间有一个空格隔开。
【输出】 输出仅一行,表示项目的最小总费用。
【样例输入】 3 4 5 6 10 9 11 【样例输出】 199
第2个月解雇1人,使得现有工人数为9人: mincost = mincost + f * (now - min[2])+s * min[2] = 90+6*1+9*5 = 141 now = 9
第3个月雇佣2人,使得现有工人数为11人:
mincost = mincost + h * (min[3] - now) + s * min[3]
的。
分析

一旦出现一个不可能在规定时限前完成 的任务,则把其扔到最大的一个空时间 段内。这样做的效果必然是最优的,因 为不能完成的任务,在任意一个时间段 中罚款数目都是一样的。
雇佣计划
一位管理项目的经理想要确定每个月 需要的工人数量。他当然知道每月所需 的最少工人数。当他雇佣或解雇一个工 人时,会有一些额外支出。一旦一个工 人被雇佣,即使他不工作,他也将得到 工资。这位经理知道雇佣一个工人的费 用、解雇一个工人的费用和一个工人的 工资。现在,他在考虑一个问题:为了 把项目的费用控制在最低水平上,他将 每月雇佣或解雇多少个工人。
begin
mincost := mincost + f * (now – min[yj]); now := min[yj];
end;
mincost := mincost + s * now;

我们从i=1开始,依上述办法逐月累计费用总和,直至i=n为止。 此时的费用总和最少。 例如,对于示例中的数据,依上述方法计算: 第1个月雇佣10人,费用总和为90;
问题分析

我们从第一个月开始,逐月计算现有工 人数,先给这些工人发放工资。 如果雇佣了新工人,则必须给新上岗人 员发放雇佣费用; 如果削减了部分工人,则必须给下岗人 员发放解雇费用。


问题分析

当月发放的工资+雇佣(或解雇)费用构成 了一个月的总费用。 我们从第一个月开始,逐月累计项目总费用,
相关文档
最新文档