我们研究了子集和问题,将求和到给定目标的一组整数的子集分为两部分以前的 练习; 在这两种情况下,我们都得到了一个精确的答案,但花费了指数时间。在今天的练习中,我们将研究子集和问题的一个变体-找到一组整数的子集,该子集的最大和不超过给定的目标-它可以接受精确和近似的答案;精确答案在指数时间内运行,虽然它通常很快,但近似答案在输入集中整数的数量上在线性时间内运行。我们的解决方案由CLRS 35.5给出。
精确解使用两个辅助函数。函数表示为L(左)+x个添加x个列表中的每个元素L(左).功能合并列表
获取两个已排序的输入列表,并返回两个列表的合并,其中删除了重复项。然后CLRS给出如下算法,其中秒是整数的排序列表t吨是目标:
E类XACT公司-S公司瑞士联合银行-S公司嗯(秒,t吨)
1 n个= |秒|
2 L(左)0= ‹0›
3 对于 我= 1到 n个
4 L(左)我=MERGE公司-我ISTS公司(L(左)我−1,L(左)我−1+x个)
5从中删除L(左)我大于的每个元素t吨
6个返回中最大的元素L(左)n个
近似算法在精确算法的基础上增加了微调步骤。修剪步骤从累加中删除L(左)列出因子0<δ<1内的部分和,以便删除任何小于1+δ乘以其前身的部分和。例如,给定L(左)=10、11、12、15、20、21、22、23、24、29›和δ=0.1L(左)'=10、12、15、20、23、24›,其中11因在10的10%以内而被删除,21和22因在20的10%以内被删除;修剪
假设L(左)= ‹年1,年2,…年米›排序:
T型RIM公司(L(左),δ)
1出租米长度为L(左)
2 L(左)‘ = ‹年1›
3 最后的=年1
4个对于 我= 22 米
5 如果 年我>最后的· (1 + δ) //年我≥最后的因为L(左)已排序
6追加年我在…的末尾L(左)‘
7 最后的=年我
8 返回 L(左)‘
然后近似亚总和
算法与精确子集
算法,但该步骤除外L(左)我=TRIM公司(L(左)我, ε/2n个)在步骤4和5之间插入,其中溶液在所需目标的0<ε<1%范围内。
您的任务是实现上述两个算法。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2