该题就两个状态,买或者不买,跟背包问题的dfs解法大同小异,代码如下:
#include <iostream>
#include <cmath>
using namespace std;
const long long maxn = 35;
long long p[maxn];
bool flag = false;
int cnt = 0;
void dfs(long long index,long long sumW,long long sumC,long long m,long long n,long long k)
{
if(sumC >k || sumW > m)
return;
if(flag)
return;
if(index == n)
{
if(sumW==m && sumC == k)
{
flag = true;
}
return;
}
dfs(index+1,sumW,sumC,m,n,k);
dfs(index+1,sumW+p[index],sumC+1,m,n,k);
}
int main()
{
long long m,n,k;
cin>>m>>n>>k;
for(int i=0; i<n; i++)
{
cin>>p[i];
}
dfs(0,0,0,m,n,k);
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}