【中国大学MOOC】算法设计与分析-贪心策略-带权活动选择-Java

1. 问题描述:

在这里插入图片描述

在这里插入图片描述

2. 核心思想

问题结构分析——递推逻辑建立——自底向上计算——最优方案追踪
在这里插入图片描述

3. 算法伪代码

核心算法

在这里插入图片描述

3. Java代码实现

// activityChoose Algorithm

public class activityChoose {
    private static class Activity{
        int startTime;
        int endTime;
        int weight;

        private Activity(int startTime, int endTime, int weight){
            this.startTime = startTime;
            this.endTime = endTime;
            this.weight = weight;
        }
    }

    private static void activityChoose(Activity[] S){
        // 记录p:在a_i开始前最后结束的活动
        int[] p = new int[S.length+1];
        p[0] = 0;
        p[1] = 0;
        for(int i=2; i<=S.length; i++){
            for(int j=i-1; j>0; j--){
                if(S[j-1].endTime <= S[i-1].startTime){
                    p[i] = j;
                    break;
                }
            }
        }
        for(int i=1; i<=S.length; i++){
            System.out.println(p[i]);
        }
        int[] D = new int[S.length+1];
        int[] Rec = new int[S.length+1];
        D[0] = 0;
        // 动态规划
        for(int j=1; j<S.length+1; j++){
            if(D[p[j]]+S[j-1].weight > D[j-1]){
                D[j] = D[p[j]] + S[j-1].weight;
                Rec[j] = 1;
            }else{
                D[j] = D[j-1];
                Rec[j] = 0;
            }
        }
        // 输出方案
        int k=S.length;
        while(k > 0){
            if(Rec[k] == 1){
                System.out.println("选择:开始时间"+S[k-1].startTime+"结束时间"+S[k-1].endTime);
                k = p[k];
            }else{
                k--;
            }
        }

    }
    // 按结束时间从小到大排序
    private static void quickSortActivity(Activity[] S, int start, int end){
        int i = start;
        int j = end;
        if (start < end){
            Activity tmp = S[i];
            while(i<j){
                while(i<j && S[i].endTime <= S[j].endTime){
                    j--;
                }
                S[i] = S[j];
                while (i < j && S[i].endTime >= S[j].endTime) {
                    i++;
                }
                S[j] = S[i];
            }
            S[i] = tmp;
            quickSortActivity(S, start, i-1);
            quickSortActivity(S, i+1,end);
        }
    }

    public static void main(String[] args){
        Activity[] S = new Activity[10];
        S[0] = new Activity(1,4,1);
        S[1] = new Activity(3,5,6);
        S[2] = new Activity(0,6,4);
        S[3] = new Activity(4,7,7);
        S[4] = new Activity(3,9,3);
        S[5] = new Activity(5,9,12);
        S[6] = new Activity(6,10,2);
        S[7] = new Activity(8,11,9);
        S[8] = new Activity(8,12,11);
        S[9] = new Activity(2,14,8);
        quickSortActivity(S, 0, 9);
        activityChoose(S);
    }
}



4. 带权活动选择问题VS活动选择问题

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值