子集和问题(回溯法)

第五章5-1 子集和问题
实验报告
一、问题分析
处理的对象:给定的集合元素的个数和集合以及要凑成的和
要实现的功能:对于给定的集合,计算出它的一个子集,使得子集内元素的和等于给出的正整数。(这一个子集就是最先计算出的那个子集)
算法思想:当我们给出集合个数n和要凑成的和m以及n个集合元素,
我们使用一个b[max]数组保存我们算出的子集,a[max]保存给出的
集合,sum保存和,我们每次看prime如果等于一表示已经输出了一
个子集了,就返回。
然后看sum是不是等于n,如果是就输出b数组,并且bool类型
prime置一。
如果不满足上述条件,我们假设假设a[k]在目标集合中,将a[k]
放到目标集合,继续寻找下一个元素,如果刚才的元素不能到最后
输出,那么会回到这,表示这个元素不在其中,将目标集合的这个元素清零,继续寻找下一个元素 。
子集和问题(回溯法)_第1张图片
详细求解过程:假设我们所给的集合为{2,2,6,5,4},首先,把2加入到b数组子集中。将sum加上2的值,此时sum为2。接着往下走,第二个元素2也不在子集中,将其加入到b数组,此时sum的值为4。继续往下走,第三个元素6不在子集中,将其加入到b数组,此时sum的值为10,恰好与给定的正整数c的值相等,输出b数组。对于子集和问题,找到问题的一个解即可,因此程序结束,将2 2 6输出到output.txt文件中。
二、算法设计
算法思想的设计:本题采取回溯法,从第一个元素开始,将这个元素加到子集当中来 ,将sum加上这个元素的值。我们使用一个b[max]数组保存我们算出的子集,a[max]保存给出的集合,sum保存和,我们每次看prime如果等于一表示已经输出了一个子集了,就返回。然后看sum是不是等于n,如果是就输出b数组,并且bool类型prime置一。如果不满足上述条件,我们假设假设a[k]在目标集合中,将a[k]放到目标集合,继续寻找下一个元素,如果刚才的元素不能到最后输出,那么会回到这,表示这个元素不在其中,将目标集合的这个元素清零,继续寻找下一个元素 。
最后判断prime如果为0,就输出“No Solution!”
算法关键步骤:
实现函数
子集和问题(回溯法)_第2张图片
主函数
子集和问题(回溯法)_第3张图片
验证:

子集和问题(回溯法)_第4张图片
子集和问题(回溯法)_第5张图片

三、算法性能分析
时间复杂度:2^n。

你可能感兴趣的:(c++,算法)