贪心算法
贪心算法:贪心算法总是做出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
贪心算法基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的求的更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
贪心算法存在的问题:
1.不能保证求的最后解是最佳的。
2.不能用来求最大或最小解问题。
3.只能求满足某些约束条件的可行解的范围。
贪心算法的基本要求:
1.贪心选择性质:指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
2.具有最优子结构性质:一个问题的最优解包含其子问题的最优解。
贪心算法解决背包问题:
物品类:Goods
package com.greed.yy;
public class Goods {
//物体的重量
private double w;
//物体的价值
private double v;
//物体的单位价值
private double p;
public Goods(double w,double v){
this.w = w;
this.v = v;
this.p = v/w;
}
public double getW() {
return w;
}
public void setW(double w) {
this.w = w;
}
public double getV() {
return v;
}
public void setV(double v) {
this.v = v;
}
public double getP() {
return p;
}
public void setP(double p) {
this.p = p;
}
}
//主类:
package com.greed.yy;
/**
* 用贪心算法解决背包问题
*
* @author yuyang_csu
*@data 2013-4-9
*/
public class Package {
// 物品个数
private int n;
// 声明背包容量的数组
private double c;
// 声明储存物品的数组
private Goods[] goods;
public Package(int n, Goods[] goods, double c) {
this.n = n;
this.goods = goods;
this.c = c;
}
// 对每个物品的单位价值进行排序
public Goods[] sort() {
Goods[] p = new Goods[goods.length];
for (int i = 0; i < p.length; i++) {
p[i] = goods[i];
}
for (int i = 1; i < p.length; i++) {
Goods tmp = p[i];
for (int j = i; j >= 1 && p[j].getP() > p[j - 1].getP(); j--) {
p[j] = p[j - 1];
p[j - 1] = tmp;
}
}
return p;
}
// 装包
public double knapsack() {
double total = 0;
Goods[] g = sort();
for (int i = 0; i < g.length; i++) {
double w = g[i].getW();
if(w>c && c!=0){
total+=c*g[i].getP();
c=0;
}else{
c-=w;
total+=g[i].getV();
}
}
return total;
}
public static void main(String[] args) {
Goods []goods = {new Goods(10,60),new Goods(20,100),new Goods(30,120)};
Package p = new Package(3,goods,50);
System.out.println(p.knapsack());
}
}
分享到:
相关推荐
基于多种常见算法实现动态规划项目c++源码+详细注释(回溯、贪心、递归、分支限界、分治等算法).zip基于多种常见算法实现动态规划项目c++源码+详细注释(回溯、贪心、递归、分支限界、分治等算法).zip基于多种常见算法...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法的基本思想、流程; 使用贪心方法解决装载问题和背包问题; 几种常见的作业调度问题:活动安排问题、带限期作业安排 问题 * 、多机调度问题 ** ; 两个图论优化问题: 最优生成树的 Prim 算法和 ...
MATLAB 实现遗传算法 二叉树 分治策略 退火算法 概率算法 贪心算法 枚举算法 回溯算法等 有源代码 有原理及改进等
这是一个曹立国老师关于图论算法的资料,介绍了信息学竞赛中常见的图论算法,我无意中获得的,拿来与大家,很有帮助的,希望能对你有帮助
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。下面是一个使用C语言实现的贪心算法示例,即“钱币找零问题”,目标是用最少的钱币...
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。下面是一个使用C语言实现的贪心算法示例,即“钱币找零问题”,目标是用最少的钱币...
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。下面是一个使用C语言实现的贪心算法示例,即“钱币找零问题”,目标是用最少的钱币...
- 三大算法思维:贪心,二分,动态规划 - 常见数据结构 ## 注意事项 - 算法,有难度,轻耐心学习 - 不仅关注题目本身,更要关注知识点和解题思路 - 按顺序学习(本章课程按顺序设计的) ## 看几个面试题 列举几...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...
算法 常见算法 排序算法 查询算法 随机算法 动态规划算法 贪心算法 回溯算法 分支限定 分治算法 哈希算法 常用的数据结构 栈 阴离子 树 跳跃表 压缩表
暴力、递归与分治、动态规划、贪心算法和回溯是算法设计中常见的几种思路和方法,经典习题是帮助我们更好掌握这些算法思想的重要途径。以下是对这些经典习题的详细说明: 1. 暴力解法习题 暴力解法往往是最直观、最...