ACM/ICPC算法基础训练教程(4)

1.4.1 基本概念

贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。
其实,从“贪心策略”一词可以看出,贪心策略总是做出在当前看来是最优的选择。也就是说,贪心策略并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心策略可以得到最优解或较优解例如:在n行m列的正整数矩阵中,要求从每一行中选一个数,使得选出的n个数的和最大。
本题可用贪心策略求解。选n次,每一次选相应行中的最大值即可。
再如:设定有n台处理机p,p,…,和m个作业j,j,…,j,处理机可并行工作,作业未完成不能中断,作业j;在处理机上的处理时间为t;,求解最佳方案,使得完成m项工作的时间最短。
本题不能用贪心算法求解。理由是:若n=3,m=6,则6个作业的时间分别是 11、7、5、5、4、7,用贪心策略(每次将作业加到最先空闲的机器上)时间为 15,而用搜索策略最优时间应是 14,但是贪心策略提供了一个线索,那就是每台处理上的时间不超过 15,为搜索提供了方便。
总之,贪心算法不能保证求得的最后解是最佳的解,一般用来求某些最大或最小解的问题,能确定某些问题的可行解的范围,特别是给搜索算法提供了依据。
贪心算法的特点如下。
(1)贪心选择性质:所谓贪心选择性质是指应用同一规划,将原问题变为一个相似的但规模更小的子问题,而后的每一步都是当前看似最佳的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。从全局来看,运用贪心策略解决的问题在程序的运行过程中无回溯过程。关于贪心选择性质,读者可在后续给出的贪心策略状态空间图中得到深刻的体会。
(2)局部最优解:局部最优解是贪心策略的数学描述。虽然运用贪心策略解题在每一次都取得了最优解,但是能够保证局部最优解的不只是贪心算法。例如,动态规划算法就可以满足局部最优解,但贪心策略比动态规划算法效率更高,占用内存更少,编写程序更简单。

1.4.2 例题讲解

【例1-8】Tian Ji-The Horse Racing.
田忌和齐王赛马,胜一场可以获得200金,负一场损失200金,平局无得无失。现在给出马的数量,田忌的每匹马的速度和齐王的每匹马的速度。求出田忌最多可以赢得多少金。
题目描述:
输人包含多组数据。每组数据的第一行为一个正整数n(n<1000),表示每一方有多少匹马,第二行为n个整数表示田忌每匹马的速度,第三行n个整数表示齐王每匹马的速度。当n为0时表示输人数据结束。每组样例输出一行,给出田忌可以赢得的具体金数
输入样例:
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
输出样例:
200
0
0
题目来源:
http://acm. tju. edu.cn/toj/showp.php?pid=1188
参考代码:

#include<iostream>
using namespace std;
int n;
int a[1000], b[1000];
int main() {
   
   
	while (cin >> n && n) {
   
    //输入每一方有多少匹马
		for (int i = 0; i < n; i++) {
   
   
			cin >> a[i];  //田忌每匹马的速度
		}
		for (int i = 0; i < n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值