贪婪算法的java实现案例
实例1.货物装船
1.情景再现
货船的最大装载量一定,现有若干货物,请最大可装载货物数量(注意求得是货物的数量)。
2.策略分析
(1).输入若干货物重量。
(2)将货物重量从小到大排序(要货物数量最多,当然要装小货物,不装大货物)。
(3)将货物的重量从最小的开始装,直到不能再装为止(再装一件货物就超过货船最大装载量)。
3.实现效果
4.代码实现
import java.util.Arrays;
import java.util.Scanner;
public class OptimizedLoading {
public static int MAXWEIGHT=30; //小船装载量
public static int AMOUNT=8; //货物个数
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[] weight =new int[AMOUNT];
System.out.println("请输入货物重量(共可以输入"+AMOUNT+"个货物的重量):");
for (int i = 0; i < AMOUNT; i++) {
weight[i]=scanner.nextInt();
}
int num=maxLoading(weight, MAXWEIGHT);
System.out.println("\n本次最多能装"+num+"个货物。");
}
public static int maxLoading (int[] weight,int maxweight){
int count=0;
int sum=0;
Arrays.sort(weight);
System.out.println("排序后的货物重量为:");
for (int i = 0; i < weight.length; i++) {
System.out.print(weight[i]+",");
}
//计算是否超重
for (int i = 0; i < weight.length; i++) {
sum+=weight[i];
if (sum<=maxweight) {
count++;
}
}
return count;
}
}
实例2.区间排列
1.情景再现
公路长度一定,有若干工程队同时申请其中一些段的维护,求最多可安排工程队数量。
2.策略分析
(1)确定每个工程队申请的区间段,要保证每个区间的起始值小于等于结束值(当然现实中是不可能等于的,哈哈哈)。
(2)将区间段的右边(结束值)作为参考,对区间进行排序,本案例用类来表示区间。类的比较参见
https://blog.csdn.net/asdfsadfasdfsa/article/details/52795438
(3)如果后一个区间的起始值小于等于前一个区间的结束值,则安排这个工程队,否则不安排这个工程队。
3.实现效果
4.代码实现
/*
* 定义类,表示申请的区间,其中compareTo函数用来实现对类的排序
* */
public class activity implements Comparable<activity> {
int start;
int end;
public activity(int start,int end) {
this.start=start;
this.end=end;
}
//使用Comparable接口中的compareTo方法使原本无法比较的对象通过某种自身条件来排序.(升序)
public int compareTo(activity cc) {
if(this.end>cc.end){
return 1;
}
else if(this.end<cc.end){
return -1;
}
return 0;
}
}
/*
* 用来输入申请区间,区间排序,以及输出可安排的区间及最大可安排区间数。
* */
import java.util.Arrays;
import java.util.Scanner;
public class activityArrange {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入申请活动的区间个数:");
int spacenum=scan.nextInt();//申请活动的区间个数
activity[] activities=new activity[spacenum];
for (int i = 0; i < activities.length; i++) {
System.out.println("请输入第"+i+"个活动的起止时间:");
int a=scan.nextInt();
int b=scan.nextInt();
if (a<b) {
activities[i]=new activity(a,b);
}else {
System.out.println("请重新输入第"+i+"个活动的起止时间:");
i--;
}
}
for (int i = 0; i < activities.length; i++) {
System.out.println("第"+i+"个活动的起始时间分别是:");
System.out.print(activities[i].start);
System.out.println(activities[i].end);
}
Arrays.sort(activities);
for (int i = 0; i < activities.length; i++) {
System.out.println("排序后的第"+i+"个活动的起始时间分别是:"+activities[i].start+"和"+activities[i].end);
}
int count=0;
int nowEnd=activities[0].end;
//因为排序后的第一个区间,一定符合区间结束值最小,且区间最短的原则
System.out.println("第"+count+"个区间为:"+activities[0].start+","+activities[0].end);
for (int i = 0; i < activities.length; i++) {
//如果后面一个区间的起始坐标大于前一个的结束坐标,则满足条件,输出;并把后一个区间的结束值赋给nowEnd。
if(activities[i].start>=nowEnd){
System.out.println("第"+(count+1)+"个区间为:"+activities[i].start+","+activities[i].end);
nowEnd=activities[i].end;
count++;
}
}
System.out.println("共可以安排"+(count+1)+"个活动。");
}
}