题意:
给你n个数,判断是否可以从中选出若干数,使他们的和恰好为k。输入:
4
1 2 4 7
13
输出
YES
2 4
输入:
4
1 2 4 7
13
输出
NO
解题思路:从最开始的状态出发,遍历所有可以达到的状态。每个元素都有两种状态,加或不加,所以时间复杂度是o(2^N).
#include<iostream>
using namespace std;
int n,k;
int a[101];
int dfs(int i,int s)
{
if(i==n)
return s==k;
if(dfs(i+1,s))
return 1;
if(dfs(i+1,a[i]+s))
{
cout<<a[i]<<" "<<endl;
return 1;
}
return 0;
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>k;
if(dfs(0,0))
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}