//部分和问题,给定正整数a1,a2,a3...,判断是否可以从中挑几个数使其和为k
#include<iostream>
using namespace std;
#define MAXN 100
int a[MAXN];
int n,k;
bool dfs(int cur,int sum)//深度优先从开始状态开始遍历所有状态
{
//前n项都计算过
if(cur==n) return sum==k;
//未加上a[i]
if(dfs(cur+1,sum)) return true;
//加上a[i];
if(dfs(cur+1,sum+a[cur])) return true;
return false;
}
void Solution()
{
if(dfs(0,0)) cout<<"yes"<<endl;
else cout<<"No"<<endl;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>k;
Solution();
system("pause");
}
部分和问题,深度优先搜索
最新推荐文章于 2022-04-07 21:20:07 发布