摘要: [问题]给定n种物品和1个背包,背包允许的最大重量为Capacity。物品i的重量为weight[i],价值为value[i]。与0-1背包问题(每种物品只有装入背包或不装入背包两种选择)不同的是,在选择物品i装入背包时,可以只装入物品i的一部分。 问应当怎样选择物品装入背包,使背包中的物品的总价值最大? [解析]该问题可用贪心法解决,所采取的贪心策略如下: (1)计算每种物品的单位重量的价值value[i]/weight[i] (2)依照贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。 (3)若将这种物品全部装入背包后,背包仍有剩余容量,则选择单位重量价值次高的物品... 阅读全文
posted @ 2013-12-25 17:27 姚来飞 阅读(985) 评论(0) 推荐(0) 编辑
摘要: [问题]设有n个活动的集合E={1,2,……,n}(按其结束时间排序),其中每个活动都要使用同一个场所,而在同一时间内只有1个活动能使用该场所。每个活动i的开始时间和结束时间分别为begin[i]和finish[i]。求E的最大相容子集合。 [解析]先选择活动1,活动1具有最早的完成时间。下面证明该问题具有贪心选择性质,即该问题有一个最优解以贪心选择开始,即该最优解中包含活动1。证明过程如下: 设子集A是该问题的一个最优解,且A中的活动按结束时间排序,其第一个活动为k: (1)若k=1,则A就是以贪心选择开始的最优解。 (2)若k>1,则设子集B=A-{k}U{1}。由于finis... 阅读全文
posted @ 2013-12-25 12:16 姚来飞 阅读(1541) 评论(0) 推荐(0) 编辑
摘要: [问题]设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。 [解析]O(lgn)的时间复杂度就是二分查找的复杂度。首先给出一个观察:如果所有元素的中位数是X,那么从数组中同时删除num个小于X的的元素和num个大于X的元素后,产生的新集合的中位数还是X。考虑如下思路求解:每次比较A,B数组的中项元素A[n/2],B[n/2],代码实现如下:int FindMiddleElement(int A[],int B[],int n) { if (n == 1) { ... 阅读全文
posted @ 2013-12-25 09:25 姚来飞 阅读(408) 评论(0) 推荐(0) 编辑