贪心算法实例(一):多任务分配问题

   给出n个任务和每个任务的开始和结束时间。找出可以完成的任务的最大数量,在同一时刻只能做一个任务。

    例子:

       下面的6个任务:

           start[]  =  {1, 3, 0, 5, 8, 5};

           finish[] =  {2, 4, 6, 7, 9, 9};

       最多可完成的任务是:

        {0, 1, 3, 4}

    分析:

       贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。

    1)按照完成时间对任务排序

    2)选择第一个任务排序数组元素并打印。

    3) 继续以下剩余的任务排序数组。

    4)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。

    具体实现代码如下所示:

/**  

*@Title: MaxActivities.java

*@Package greedyalgorithm

*@Description: TODO

*@author peidong 

*@date 2017-5-15 上午9:31:42

*@version V1.0  

*/

packagegreedyalgorithm;

/**

 * @ClassName: MaxActivities

 * @Description: 贪心算法实例:多任务问题

 * @date 2017-5-15 上午9:31:42

 * 

 */ 

publicclass MaxActivities {

       /**

        *

       * @Title: printMaxActivities

       * @Description: 最多任务选择

       * @param start  任务开始时间数组

       * @param end    任务结束时间数组

       * @param n      任务总数

       * @return void    

       * @throws

        */

       public static voidprintMaxActivities(int[] start, int[] end, int n){

              int i = 0; //初始任务

              System.out.print(i + "");//打印初始任务

             

              //后续任务选择

              for(int j = 1; j <n; j++){

                     //如果当前任务开始比前一个任务的结束时间大或相等,则打印此任务

                     if(start[j] >= end[i]){

                            System.out.print(j +" ");

                            i = j;

                     }

              }

       }

       /**

        *@Title: main

        *@Description: 测试用例

        *@param args   

        *@return void   

        *@throws

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

               int[] start = {1, 3, 0, 5, 8, 5};

         int[] end = {2, 4, 6, 7, 9, 9};

         int n = start.length;

         printMaxActivities(start, end, n);

       }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxpr_ybgg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值