本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法。编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习)。
我们直接来看一个问题。
给定一个由n个整数组成的集合,其中n <= 40,每一个整数都小于或等于,请从中找出一个子集,使得子集中所有元素的和为最大并且不大于S,此处S满足 S <=。
我们用例子来说明。
【例题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
分析思路
最直接的算法就是暴力搜索:找到N个整数的所有可能的子集,检查子集的元素和否小于或等于S,并从中找出元素和为最大的子集。
想法简单暴力,我喜欢!
但是它是否可行呢?
我们来看看这种算法的时间复杂度。
我们知道n个元素的集合,它的所有子集个数有