部分和问题
给定整数a1\a2…\an,判断是否可以从中选出若干数,使它们的和恰好为k。
限制条件:
-
1<=n<=20
-
-10^8 <=ai<=10^8
-
-10^8 <=k<=10^8
样例1:
输入:
n=4
a={1,2,4,7}
k=13
输出:
Yes
样例2:
输入:
n=4
a={1,2,4,7}
k=15
输出:
No思路:从a1开始按顺序决定每个数加或者不加,用深度优先搜索解题。
#include<iostream>
using namespace std;
int n,k,a[21];
//已经从前i项得到了和sum,对i项之后进行分支
bool dfs(int i, int sum)
{
//若前n项都算上了,则返回sum是否等于k
if(i==n)
return sum==k;
//不加上a[i]
if(dfs(i+1,sum))
return true;
//加上a[i]
if(dfs(i+1,sum+a[i]))
return true;
return false;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>k;
//最开始已加0项,和为0
if(dfs(0,0))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}