集合最大子集算法_折衷算法

本文介绍了如何解决寻找集合中最大子集和不超过给定值S的问题,通过折衷算法降低了时间复杂度。文章首先解释了暴力搜索方法的局限性,然后详细阐述了折衷算法的步骤:将集合拆分为两部分,计算子集和并存储,对其中一个集合进行排序,使用二分搜索法找到最大和不超过S的子集。最后提供了C++代码实现该算法。
摘要由CSDN通过智能技术生成

本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法。编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习)。

我们直接来看一个问题。

给定一个由n个整数组成的集合,其中n <= 40,每一个整数都小于或等于89824fea66f414df964e1bb79f84b359.png,请从中找出一个子集,使得子集中所有元素的和为最大并且不大于S,此处S满足 S <=23687a7c6e1c80a2307ad24ebcc918f0.png

我们用例子来说明。

【例题1】

输入集合为 {45,34,4,12,5,2},n=6, S = 42

也就是从集合的6个元素中选择适当的元素组成一个子集,使得子集所有元素的和最大,并且该和小于或等于42。

【答案】该子集为{34,5,2},它的元素和为34+5+2=41,就是满足条件的最大子集和。

现在改变S的值,请你自己做下面的例子。

【例题2】

输入集合为 {3,34,4,12,5,2},n=6, S = 10

2f616a7cb863ef36e114307670dc863a.png

分析思路

最直接的算法就是暴力搜索:找到N个整数的所有可能的子集,检查子集的元素和否小于或等于S,并从中找出元素和为最大的子集。

想法简单暴力,我喜欢!

但是它是否可行呢?

我们来看看这种算法的时间复杂度。

我们知道n个元素的集合,它的所有子集个数有68f9ad90c934e838c070adcb6373b8d9.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值