#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int flag=0;
void dfs(long long s,int k,int i,long long a[],long long m,int K,int n)
{
for(int j=i+1;j<n;j++)
{
s=s+a[j];
k++;
if(k==K && s==m)
{
flag=1;
return;
}
else if(k<K && s<m)
{ dfs(s,k,j,a,m,K,n);
s-=a[j];
k--;
}
else
{
s-=a[j];
k--;
}
}
}
int main()
{
long long m;
int n,K;
cin>>m>>n>>K;
long long a[n];
for(int i=0;i<n;i++)
cin>>a[i];
dfs(0,0,-1,a,m,K,n);
if(flag==1)
cout<<"Yes";
else
cout<<"No";
return 0;
}
之前一直AC不了,其实就是dfs里的思路没想好。
如果当前基础是还有希望的,就继续dfs,当然别忘了dfs之后要回来减掉当前状态去下一次循环。
而如果当前基础已经没有希望成功了,就直接减掉当前状态去下一次循环。