贪婪算法的java实现案例

it2023-07-20  69

实例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)+"个活动。");     } }

 

最新回复(0)