JAVA算法:贪心算法典型题目详解(JAVA版本)
题目一:最优装载问题
一条小船用来运输古董到河对岸。假设船的最大载重量为MAXWEIGHT,每件古董的重量为,怎么能够装载最多数量的古董到船上呢?
样例数据:
MAXWEIGHT 为 30
给定8个古董,重量分别为:[4, 10, 7, 11, 3, 5, 14, 2]
算法分析
这个问题是一个典型的可以使用贪心算法解决的问题。
通过分析题目可以看到,小船的载重量(MAXWEIGHT)是固定的,要求装载的物品数量最多,那么应该优先选择把重量最小的物品装上船,然后不断装载剩余的物品,直到达到小船载重量的要求。
选择先装载重量最小的物品,这个选择策略就采用了贪心(Greedy)策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。
算法设计与实现
package com.bean.algorithm.learning;
import java.util.Arrays;
public class OptimizedLoading {
public static int MAXWEIGHT = 30;// 小船的载重量
public static int AMOUNT = 8;// 古董个数
/*
* 装载算法(贪心算法)
* */
public static int maxLoading(int[] weight) {
//计数器,用于记录装载到小船上古董的数量
int counter = 0;
// 对weight数组进行排序
Arrays.sort(weight);
int temp = 0; // 记录装载到船上的古董重量
for (int i = 0; i < AMOUNT; i++) {
temp += weight[i]; // 贪心策略:每次装入最轻者
if (temp <= MAXWEIGHT) // 若加入最轻者后还小于载重量,则古董个数+1
counter++;
else
//超重,不能装载
break;
}
//返回装载的古董的数量
return counter;
}
public static void main(String[] args) {
int ANSWER = 0; // 记录已装载的古董个数
int[] weight = { 4, 10, 7, 11, 3, 5, 14, 2 };
ANSWER = maxLoading(weight);
System.out.println("能装入的古董最大数量为: " + ANSWER);
}
}
程序运行结果:
能装入的古董最大数量为: 5
题目二:活动安排
设有n个活动的集合e={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间s_i和一个结束时间f_i,且s_i< f_i。如果选择了活动i,则它在半开时间区间[s_i,f_i]内占用资源。若区间[s_i,f_i]与区间[s_j,f_j]不相交,则称活动 i 与活动 j 是相容的。也就是说,当s_i ≥ f_i或s_j ≥ f_j时,活动 i 与活动 j 相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
在下面所给出的解活动安排问题的贪心算法gpeedyselector中,各活动的起始时间和结束时间存储于数组s和f{中且按结束时间的非减序:.f_1 ≤ f_2 ≤ … ≤ f_n排列。如果所给出的活动未按此序排列,我们可以用o(nlogn)的时间将它重排。
package com.bean.algorithm.beginner;
import java.util.ArrayList;
import java.util.List;
public class ActivitiesDemo {
public static List<Integer> arrangeActivity(int[] start, int[] end) {
int total &#