贪心算法java实现

实例:

活动安排问题:

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si >= fj或sj >= fi时,活动i与活动j相容。

解决方案:

使用贪心算法,按结束时间排序后,每次选择活动结束时间最小的一个,以尽可以的多的可以按排余下活动

0-1背包问题:

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。

解决方案:

使用动态规划算法,每个物品有放和不放两种选择,看哪种方案更优,动态规划算法将问题划分为子问题,后面的子问题会使用到上一步的计算结果,以节省计算时间。0-1背包问题(要么放要么不放,不能放一部分,不适合使用贪心算法,因为有可能,余下背包的一些空间,导致整体单元价值偏低。动态规划算法实现见:http://blog.csdn.net/u011750989/article/details/12967575

背包问题:

与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n。

解决方案:

使用贪心算法,每次选择单元价值最高的放入

实现代码

/*背包问题,非0-1背包问题
 * 建立物品类有两个属性:重量和价值
 * 加入arraylist
 * Collections.sort 自定义比较算法,按价值/重量,单位价值越高者越靠前
 * 
 * 再建个arraylist(result)存储上面各个物品该存入多少比率,比如1,该物品都放进背包
 * 0.5,放一半,0不放
 * 
 * int sum=0;//重量累计
 * int v=0; //价值累计
 * for i in arraylist  //已按单价排好序
 * 
 * if sum>=total
 * break;
 * 
 *物品i还能完全放进背包
 * else  if (sum+wi<=Total)
 * sum=sum+wi;
 * v=v+vi
 * result.add(1)
 * 
 *物品i只能放入部分了
 * else  if  sum+wi>total
 * v=v+(total-sum)/wi * v(i)
 * sum=total
 * result.add((total-sum)/wi)
 *  /
/*
 * 活动安排问题
 * 建立个活动类,比如有活动名称,开始时间,结束时间
 * 放个arraylist
 * Collections.sort 自定义排序算法,按结束时间升序,越早越靠前
 * 
 * 建个结果表arraylist(result)
 * 
 *  result.add(list0])
 *  temp=list[0]
 * for j in arraylist+1  //从第二个活动开始
 * 
 * if j.开始时间>=temp.结束时间 
 *  result.add(list[j])
 *  temp=list[j]
 *   
 * 
 */

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春哥一号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值