贪心java
来源:互联网 发布:python tts 引擎 编辑:程序博客网 时间:2024/06/06 02:45
完全背包问题
一个旅行者有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,
每件的价值分别为C1,C2,...,Cn.若的每种物品的件数足够多.
求旅行者能获得的最大总价值。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
贪心算法的基本思路
1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解。 实现该算法的过程: 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解。
下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。
/** * 背包贪心法 * * @author *** * */ public class Greedy { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Please enter the number of objects(请输入物品的数量:):"); int n = in.nextInt(); int[] w = new int[n]; // 物品重量数组 int[] v = new int[n]; // 物品价钱数组 System.out .println("Now, please enter the weight of these objects(现在请输入这些物品的重量:)"); for (int i = 0; i < n; i++) { w[i] = in.nextInt(); } System.out .println("Now, please enter the value of these objects(现在请输入这些物品的价值:)"); for (int i = 0; i < n; i++) { v[i] = in.nextInt(); } System.out .println("Now, please enter the capacity of the pack(现在请输入背包的容量:)"); int c = in.nextInt(); /** * 按单位重量价值r[i] = v[i] / w[i]降序排列 * * ps:排序用到了选择排序,详情请查看选择排序 */ double startTime = System.currentTimeMillis(); double[] r = new double[n]; int[] index = new int[n]; for (int i = 0; i < n; i++) { r[i] = (double) v[i] / (double) w[i]; index[i] = i; } double temp = 0; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (r[i] < r[j]) { temp = r[i]; r[i] = r[j]; r[j] = temp; int x = index[i]; index[i] = index[j]; index[j] = x; } } } /** * 排序后的重量和价值分别存到w1[]和v1[]中 */ int[] w1 = new int[n]; int[] v1 = new int[n]; for (int i = 0; i < n; i++) { w1[i] = w[index[i]]; v1[i] = v[index[i]]; } /** * 初始化解向量x[n] */ int[] x = new int[n]; for (int i = 0; i < n; i++) { x[i] = 0; } /** * 求解并打印解向量 */ for (int i = 0; i < n; i++) { if (w1[i] < c) { x[i] = 1; c = c - w1[i]; } } System.out .println("The solution vector is(解向量是:)" + Arrays.toString(x)); /** * 根据解向量求出背包中存放物品的最大价值并打印 */ int maxValue = 0; for (int i = 0; i < n; i++) { if (x[i] == 1) maxValue += v1[i]; } double endTime = System.currentTimeMillis(); System.out .println("Now, the largest values of objects in the pack is(背包中物品的最大价值为:)" + maxValue); System.out.println("Basic Statements take(基本语句用时)" + (endTime - startTime) + " milliseconds!"); } }
阅读全文
0 0
- 贪心java
- 贪心算法java实现
- maximum-subarray Java 贪心
- 贪心算法-java
- Java数据结构贪心算法
- Java - 编译器的贪心规则
- java背包问题(贪心法)
- 贪心算法-排队问题-JAVA
- 贪心算法-整数区间-JAVA
- 贪心算法-均分纸牌-JAVA
- hsu 1052贪心(java)
- Java - 贪心算法 - 跳跃游戏
- 蓝桥杯-最小乘积-贪心-java
- 贪心!
- 贪心~
- 贪心
- 贪心
- 贪心
- 大话数据结构 code 第7章 图 01邻接矩阵创建_CreateMGraph
- 单片机下位机通讯接收字符数组
- mysql常用命令
- 度度熊回家问题
- JAVA学习路线图(一文详解)
- 贪心java
- mac安装anaconda之后,如何配置环境变量
- 百度之星 度度熊的午饭时光
- OpenCV3.3出炉,DNN为最大亮点
- 1-9配置和保护openssh服务
- PHP安装pdo扩展
- 字符编码的历史演变
- 51nod1154(回文串划分)
- springboot的helloworld