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. Javascript Iterator

    [Javascript Iterator] 1.@@iterator Whenever an object needs to be iterated (such as at the beginning ...

  2. python文件操作 二

    问题:在传输的时候对方不知道是以什么格式传给用户,传来传去彼此都忘了什么格式: 在编码的时候:utf8:是3个字符,gbk是2个字符,每个字符数字对应的字符,一段2进制串,如果10个字节全部都是中文, ...

  3. Mysql 5.7 忘记root密码或重置密码的详细方法

    在Centos中安装完MySQL数据库以后,不知道密码,这可怎么办,下面给大家说一下怎么重置密码 在Centos中安装完MySQL数据库以后,不知道密码,这可怎么办,下面给大家说一下怎么重置密码 1. ...

  4. docker 安装与使用

    1.yum安装docker yum -y install docker 2.启动docker service docker start 3.检验运行状态 systemctl status docker ...

  5. JMeter学习(九)FTP测试计划(转载)

    转载自 http://www.cnblogs.com/yangxia-test FTP服务主要提供上传和下载功能.有时间需要我们测试服务器上传和下载的性能.在这里我通过JMeter做一个FTP测试计划 ...

  6. Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  7. PHP实现curl和snoopy类模拟登陆方法

    Snoopy.class.php下载 方法/步骤   第一种:使用snoopy类实现模拟登陆 1.在网上下载一个Snoopy.class.php的文件   2.代码实现: <?php set_t ...

  8. phpStudy安装教程

    1.在phpStudy官网下载安装包(http://phpstudy.php.cn/)2.解压安装后,若提示没有“VC9.VC11.VC14运行库,注意是X86 32位”,则在phpStudy下载对应 ...

  9. gridview空间使用

    1.HTML代码 <asp:GridView ID="gv_Info" runat="server" AutoGenerateColumns=" ...

  10. jQuery Grid高级指南

    上周以为已经把jqgrid 表格这部分已经搞得差不多了,没想到在实际用的时候,出现了不少问题,重新把这块知识整理一下. 问题一:设置表格的自动刷新 问题的原因: 使用表格自带的增删改查的功能,编辑完数 ...