看到这个题目,首先要想到动态规划的思想,对于这个题来说,主要是终止条件不好找。请看下图,我们设置函数为Subset()。
看上图,假设我们对arr[i]来说,它有两种可能选它或者不选它
a.选它,那我们就看对于arr[i-1]之后的数字是否可以组成S-arr[i];
b.不选它,那我们就看对于arr[i-1]之后的数字来说是否可以组成S .
下来我们来看终止条件:
a.若调用某次函数之后,S恰好等于0那么则认为,可以组成S
b.若循环调用至最后一个数字arr[0],那么看arr[0]是否等于S,等于返回true,不等于返回false。
具体代码如下:
/*给定一个数组,判断数组内是否存在n(n>=S个数,使其和恰好等于给定整数S。*/
bool rec_subset(vector<int>&arr, int i, int s) {
//i=arr.size()-1;
if (s =&#