贪婪算法的java实现案例

实例1.货物装船

1.情景再现

货船的最大装载量一定,现有若干货物,请最大可装载货物数量(注意求得是货物的数量)

2.策略分析

(1).输入若干货物重量。

(2)将货物重量从小到大排序(要货物数量最多,当然要装小货物,不装大货物)。

(3)将货物的重量从最小的开始装,直到不能再装为止(再装一件货物就超过货船最大装载量)。

3.实现效果

贪婪算法的java实现案例

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.实现效果

贪婪算法的java实现案例贪婪算法的java实现案例

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