问题表述:设有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相容。
解决方案:
使用贪心算法,按结束时间排序后,每次选择活动结束时间最小的一个,以尽可以的多的可以按排余下活动
给定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]
*
*
*/