Java 算法(一)贪心算法

数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html)

一、贪心算法

什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。 因此贪心算法不会对所有问题都能得到整体最优解,但对于很多问题能产生整体最优解或整体最优解的近似解。

贪心算法的构成部分:

  1. 候选对象集合 :候选添加进解的对象的结合·
  2. 解对象集合 :初始时为空,逐步从候选对象集合添加
  3. 解判定函数 :判定解是否己经完成(或候选对象集合是否还有可以添加的对象)
  4. 选择函数 :从候选对象集合中按照贪心策略选择可用对象添加到解对象集合中
  5. 目标函数 :记录解的值

二、0-1 背包问题

给定 n 种物品和一个背包。物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

经典的背包问题,这次选用贪心算法来解决,每次选择能装的物品中:

  1. 价值最大的
  2. 重量最小的
  3. 单位重量价值最大的
/**
* 贪心算法:0-1 背包问题
*/
public class GreedyAlgorithm { // 候选对象
private Bag[] candidates;
// 背包的总承重
private int maxWeight; // 解对象集合
private Set<Bag> resultSet = new HashSet<>();
// 解对象集合的值
private int result; public GreedyAlgorithm(Bag[] candidates, int maxWeight) {
this.candidates = candidates;
this.maxWeight = maxWeight;
// 对背包按单位重量价值从大到小排序
Arrays.sort(candidates, Collections.reverseOrder());
} public void select() {
int remainingWeight = maxWeight; for (int i = 0; i < candidates.length; i++) {
Bag candidate = candidates[i];
// 判断当前物品是否可以放入背包中
if (check(candidate, remainingWeight)) {
result += candidate.value;
resultSet.add(candidate);
remainingWeight -= candidate.weight;
} else {
break;
}
}
} // 判定解是否己经完成
public boolean check(Bag candidate, int remainingWeight) {
if (remainingWeight >= candidate.weight) {
return true;
}
return false;
} public Set<Bag> getResultSet() {
return resultSet;
} public int getResult() {
return result;
} public static class Bag implements Comparable<Bag> {
// 物品重量
private int weight;
// 物品价值
private int value;
// 单位重量价值
private int unitValue; public Bag(int weight, int value) {
this.weight = weight;
this.value = value;
this.unitValue = (weight == 0) ? 0 : value / weight;
} @Override
public int compareTo(Bag bag) {
int value = bag.unitValue;
if (unitValue > value)
return 1;
if (unitValue < value)
return -1;
return 0;
}
}
}

每天用心记录一点点。内容也许不重要,但习惯很重要!

Java 算法(一)贪心算法的更多相关文章

  1. 算法(Java实现)—— 贪心算法

    贪心算法 应用场景-集合覆盖问题 假设在下面需要付费的广播台,以及广播台新型号可以覆盖的地区,如何选择最少的广播台,让所有地区都可以接收到信号 广播台 覆盖地区 k1 北京.上海.天津 k2 广州.北 ...

  2. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  3. 《Java算法》贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法的经典案例: 跳跃游戏: 给定一个非负整 ...

  4. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

  5. [算法导论]贪心算法(greedy algorithm)

    转载请注明出处:http://www.cnblogs.com/StartoverX/p/4611544.html 贪心算法在每一步都做出当时看起来最佳的选择.也就是说,它总是做出局部最优的选择,寄希望 ...

  6. 数据结构与算法之贪心算法 C++实现

    1.基本思路:从问题的某一个初始解触发逐步逼近给定的目标,以尽可能快的求得更好的解. 当达到算法中某一步不能再继续前进时.就停止算法,给出近似值.也就是说贪心算法并不从总体最优考虑,它所作出的选择仅仅 ...

  7. dijkstra算法(贪心算法)——解决最短路径问题

    最短路径 给定一张带权图和其中的一个点(作为源点),求源点到其余顶点的最短路径 基本思想 1)源点u,所有顶点的集合V,集合S(S中存有的顶点,他们到源点的最短路径已经确定,源点u默认在S中),集合V ...

  8. 基于贪心算法求解TSP问题(JAVA)

    概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ...

  9. HDU2037 今年暑假不AC 贪心算法

    贪心算法 : 贪心算法就是只考虑眼前最优解而忽略整体的算法, 它所做出的仅是在某种意义上的局部最优解, 然后通过迭代的方法相继求出整体最优解. 但是不是所有问题都可以得到整体最优解, 所以选择贪心策略 ...

  10. 剑指Offer——贪心算法

    剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...

随机推荐

  1. js 事件event

    var EventUtil = { addHandler: function(element,type,handler){ if(element.addEventListener){ element. ...

  2. windows上java中文乱码-指定字符集 -Dfile.encoding=UTF-8

    jvm启动中增加参数: -Dfile.encoding=UTF-8 重启即可.

  3. postman发送json请求

    简介: postman是一个很好的http模拟器,在测试rest服务时是很好用的工具,可以发送get.post.put等各种请求. 发送json的具体步骤: 1.选择post请求方式,同时将heade ...

  4. 第九章 词典 (e)桶/计数排序

  5. 第二章 向量(b)可扩充向量

  6. 使用FFMPEG类库分离出多媒体文件中的H.264码流

    在使用FFMPEG的类库进行编程的过程中,可以直接输出解复用之后的的视频数据码流.只需要在每次调用av_read_frame()之后将得到的视频的AVPacket存为本地文件即可. 经试验,在分离MP ...

  7. Flask总结

    Flask的优缺点 优点:Flask小而精,三方组件全 缺点:稳定性相对较差,三方组件版本问题,Flask一旦迭代,就可能造成三方组件不兼容的问题. flask三剑客 + 小儿子 Django    ...

  8. WEB 自动化思路

    前期做了一个关键字驱动模型的WEB自动化项目,特意写文章归纳和总结下. 框架架构图 已经实现的部分: 1. 读写excel数据模板 2.配置中心,支持properties,xml格式的配置文件 3.参 ...

  9. 202. Happy Number (INT)

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  10. LinearLayout 线性布局

    android:orientation 设置布局管理器内组件的排列方式,可设置为 horizontal (水平排列).vertical (垂直排列) android:gravity 设置布局管理器内组 ...