ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-12-29 12:29:05  阅读:188  来源: 互联网

标签:MOOC Java weight int 带权 startTime Activity new endTime


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活动选择问题

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

在这里插入图片描述

标签:MOOC,Java,weight,int,带权,startTime,Activity,new,endTime
来源: https://blog.csdn.net/t949500898/article/details/111880887

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有