贪心算法入门

今天看了一下贪心算法,贪心算法没有具体的算法框架。贪心算法主要找当前看来最好的解,没有考虑整体最优。得到的只是局部最优解。

贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

二、贪心算法的基本思路:

1.建立数学模型来描述问题。

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

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

三、贪心算法适用的问题

      贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

    实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架

从问题的某一初始解出发;

while (能朝给定总目标前进一步)

{

利用可行的决策,求出可行解的一个解元素;

}

由所有解元素组合成问题的一个可行解;

下面摘自百度文库

排队问题 
【题目描述】 
 在一个医院B 超室,有n个人要做不同身体部位的B超,已知每个人需要处理的时间为ti,(0<i<=n),请求出一种排列次序,使每个人排队等候时间总和最小。 
输入数据:第1行一个正整数n(你<=10000》,第2行有n 个不超过 1000的正整数ti. 
输出要求:n个人排队时间最小总和。 输入输出样例 输入:4 5 10 8 7 输出: 67 
【算法分析】 
本题贪心算法:n个人时间从小到大排序,就是这n个人最佳排队方案。求部分和的和即为所求。 
反证法证明:假设有最优解序列:s1,s2„sn,如s1不是最小的Tmin,不妨设sk=Tmin,将s1与sk对调,显然,对sk之后的人无影响,对sk之前的人等待都减少了,(s1-sk)>0,从而新的序列比原最优序列好,这与假设矛盾,故s1为最小时间,同理可证s2„sn依次最小

下面是对百度文库中排队问题的实现

 1 //一个贪心算法小例子
 2 //贪心算法每次寻找局部最优解
 3 //贪心算法是否合适需要数学来论证其解是否为最优解
 4 //可以参考背包问题
 5 public class Greed {
 6
 7     public static void main(String[] args) {
 8         int array[] = {5, 10, 8, 7};
 9         Greed greed = new Greed();
10         int time = greed.getTime(array);
11         System.out.println("time is: " + time);
12     }
13     //这里随便用的一个排序算法
14     //明天再系统的看看排序算法
15     //这里用的好像是选择排序
16     //每次选择最小的或者最大的数
17     //这里我采用升序的方式
18     public void sort(int array[]){
19         int min;
20         for(int i = 0; i < array.length; i++){
21             min = i;
22             for(int j = i + 1; j < array.length; j++){
23                 if(array[i] > array[j])
24                      min = j;
25             }//每一趟找出i后面最小值
26             if(i != min){
27                 int temp;
28                 temp = array[i];
29                 array[i] = array[min];
30                 array[min] = temp;
31             }//如果array[i]不是最小值,交换array[i]和array[min]的值
32         }
33     }
34
35     /**
36      * 计算所有的时间和
37      * @param array
38      * @return
39      */
40     public int getTime(int array[]){
41         int sum = 0;
42         //先排序,在求部分和
43         sort(array);
44         show(array);
45         for(int i = 0; i < array.length; i++){
46             int time_one = 0;
47             for(int j = i; j >= 0; j--){
48                 time_one += array[j];
49             }
50             sum += time_one;
51         }
52         return sum;
53     }
54
55     public void show(int array[]){
56         for(int i = 0; i < array.length; i++){
57             System.out.print(array[i] + " ");
58         }
59         System.out.println();
60     }
61 }
时间: 2024-11-06 07:15:41

贪心算法入门的相关文章

51nod贪心算法入门-----活动安排问题2

题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. 1 #include<stdio.h> 2 #include<iostream> 3 #include<stdlib.h> 4 #include<queue> 5 using namespace std; 6 struct node 7 { 8 int start; 9 i

51nod贪心算法入门-----完美字符串

约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同.给定一个字符串,输出它的最大可能的完美度.例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77. //这题水题,只要把每个字母出现的次数统计出来然后再排序一下就OK了. #include<stdio.h>#include<iostream>#include<

51nod贪心算法入门-----活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 我们可以知道先安排最早结束的活动可以更多的安排活动.首先就是将所有的活动结束时间按先后顺序给排序:然后以结束时间为线索

贪心算法入门典型案例

在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大.输入:第一行两个正整数N和M,用空格隔开,表示行数和列数 第2行到第N+1行,每行M个用空格隔开的整数 ,表示矩阵 输出最大总和 1 #include <stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 int main() 6 { 7 int i,j,N,M; 8 int total=0; 9 int maxI,t; 10 11 //

入门级贪心算法——java实现

贪心算法入门 贪心算法是一种思路,而不是一种公式. 认真看,一会儿就会了! 个人网站:多猫影视(能看各大vip视频)www.duomao.xyz package com.niu.test; import java.util.Scanner; /** * Created by Administrator on 2017/9/28. */ public class TanXin1 { /** * 贪心算法,找零钱 * 假设有100 50 10 1零钱供找零,输入找零的钱返回找零的钱和张数 * * 思

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

POJ1017 Packets(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 51306          Accepted: 17391 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

贪心算法的简述与示例

贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯.能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质. 参考:http://babybandf.blog.163.com/blog/static/61993532010112923767/ [例1]删数问题[B][/B] 试题描

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &