贪心算法

1.基本概念

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

2.基本思路

贪心算法的基本思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。

三、贪心算法适用的问题

贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架

从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{ 
      利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;

实例分析:

1.汽车加油问题

一辆汽车加满油后可以行驶N千米。旅途中有若干个加油站。指出若要使沿途的加油次数最少,设计一个有 效的算法,指出应在那些加油站停靠加油。给出N,并以数组的形式给出加油站的个数及相邻距离,指出若要使沿途的加油次数最少,设计一个有效的算法,指出应 在那些加油站停靠加油。要求:算法执行的速度越快越好。
数据输入输出见算法设计与分析第四版p111.

package algriothem;

import cn.sxt.mycollection.LinkList01;

import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @Author: Hongyang HU
 * @Desciption: 1.学习别人读入字符串,并进行数据处理
 *              2.实现贪心算法
 * @Date: 2020/2/17 12:48
 */


public class Tanxin_jiayouzhan {

    private static LinkedList<Integer> linkedList=new LinkedList<>();


    public static void main(String[] args) {
        File input = new File("input.txt");
        File output = new File("output.txt");

        FileReader fr = null;
        FileWriter fw = null;
        BufferedReader br = null;
        BufferedWriter bw = null;
        String tempString = "";
        StringBuilder sb=new StringBuilder();
        try{
            fr=new FileReader("input.txt"); //字符流对象
            fw=new FileWriter("output.txt");
            //使用缓冲字符流进行包装
            br=new BufferedReader(fr);
            bw=new BufferedWriter(fw);
            //BufferenReader提供了readLine,返回一个字符串对象,及文本的一行内容
            while((tempString=br.readLine())!=null){
                String[] arr=tempString.split("\\s+"); //使用正则表达式进行切割字符串
                for(String ss : arr){
                    linkedList.add(Integer.parseInt(ss));  //使用linkedList+包装类转型,构成字符
                }
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        int len=linkedList.size();
        for (int a: linkedList
             ) {
            System.out.println(a);
        }
        int temp = jiayouzhan(linkedList, len);
        System.out.println("temp:"+temp);
        try {
            bw.write(temp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    public static int jiayouzhan(LinkedList<Integer> linkedList ,int len){
        int n=linkedList.get(0),num=linkedList.get(1);
        int s=0,sum=0;
        for (int i=2;i<len;i++){
            if (linkedList.get(i)>n){
                System.out.println("No soulution!");
                return -1;
            }
        }
        for (int i=2;i<len;i++){
            s+=linkedList.get(i);
            if (s>n){
                sum++;
                i--;
                System.out.print("S:"+i+"\t");
                System.out.println(s);
                s=0;

            }
        }
        return sum;
    }
}

输出仍然有些问题:
image.png

。暂时未能解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑...
    麒麟楚庄王阅读 6,981评论 0 1
  • 一、概念 贪心算法,又称贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以...
    TomyZhang阅读 349评论 0 0
  • 目录 1.贪心算法步骤 2.两个关键要素 3.两种背包问题3.1 0-1背包问题(适用于动态规划,不满足贪心选择性...
    王侦阅读 5,062评论 2 3
  • 风吹柳花草依依,停步折花不忍泣。 君若相思莫相离,夜半无人声戚戚。
    深巷梨花阅读 279评论 3 7
  • 中秋节的时候我和堂哥视频聊天,视频接通的时候我很惊讶,手机对面那个沧桑看着像四十多的人还是我记忆中那个温...
    仪琳阅读 330评论 2 1