标签:subset 剪枝 return 递归 int sum 样例 问题 子集
问题描述:集合M(M元素个数≤100),整数S(≤20000),问集合M里面是否存在子集和等于S。若相等,返回Ture,否则,返回False.
输入样例1:
4 7
6 4 2 1
输出样例1:
True
输入样例2:
4 20
6 3 4 2
输出样例:
False
坑点1:此程序执行需要剪枝,时间复杂度为O(NS)否则为2^N |
---|
坑点2:当集合M内为98个1 第99个为100 S为100时,则剪枝无效 |
样例1执行图示:
Code:
#include<iostream>
#include<algorithm>
using namespace std;
int *a,N,S;
bool subset(int i,int sum){//存储下标和总值和
//剪枝
if(sum==S)//当sum==S时说明子序列里面存在元素相加为S
return true;
if(i>=N)//当i大于元素个数N的时候说明未找到 即使写i>=N也不会崩掉
//因为如果i与N的个数相等时候sum==S那么他就会在上面执行返回走了
return false;
if(sum>S)//当执行到此处前面的子元素加起来已经超过S了 后面没有必要再继续执行了
return false;
subset(i+1,sum+a[i])||subset(i+1,sum);//选则某个值(在sum里面累加上a[i])和不选
}
int main(){
cin>>N>>S;
a=new int[N];
for(int i=0;i<N;i++)
cin>>a[i];
string res=subset(0,0)?"True":"False";
cout<<res;
return 0;
}
标签:subset,剪枝,return,递归,int,sum,样例,问题,子集 来源: https://blog.csdn.net/Fight_adu/article/details/104742779
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。