#include<iostream>
#include<cstring>
using namespace std;
int n,k,a[30],pre[30];
/*
bool dfs(int i,int sum)
{
//如果i=n了,就判断sum与k的关系,如sum=k就说明有几个数的和为k,否则说明没有
if(i==n){
if(sum==k)
return 1;
else
return 0;
}
//不加上第i+1个数
if(dfs(i+1,sum)==true)
return 1;
//加上第i+1个数
if(dfs(i+1,sum+a[i])==true){
pre[i]=a[i];
return 1;
}
//不管加不加上第i+1个数,sum都不等于k,返回0
return 0;
}
*/
bool dfs(int i,int sum)
{
if(i==n){ //如果i=n了,就判断sum与k的关系,如sum=k就说明有几个数的和为k,否则说明没有
if(sum==k)
return 1;
else
return 0;
}
else{
if(dfs(i+1,sum)==true) //不加上第i+1个数
return 1;
if(dfs(i+1,sum+a[i])==true){ //加上第i+1个数
pre[i]=a[i];
return 1;
}
return 0; //不管加不加上第i+1个数,sum都不等于k,返回0
}
}
int main()
{
int i,sum,loop;
while(cin>>n>>k){
for(i=0;i<n;i++)
cin>>a[i];
i=sum=0;
memset(pre,0,sizeof(pre));
dfs(i,sum);
loop=dfs(i,sum);
if(loop==true){
cout<<"YES"<<endl;
for(int j=0;j<30;j++)
if(pre[j]!=0)
cout<<pre[j]<<" ";
cout<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}
总结:DFS。
下面的那个dfs()函数 逻辑比较清晰,好好理解一下。程序如果写的简单了,好看,但是逻辑会比较模糊。现在水平还不够,还是写的详细一点吧。
详细解释看注释,并附上参考的文章 一道DFS小题