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
。暂时未能解决