实在是睡不着呀,蛋疼,没办法,还是下床x写了下晚上没搞定的这道题目;
下面先贴上刚开始没AC的代码;
#include<iostream>
#include<string.h>
using namespace std;
int a[21],book[21];
int n,k,flag;
void dfs(int step,int sum)
{
int i;
if(step<=n)
{
if(sum>k)
return;
if(sum==k&&flag==0)
{
flag=1;
return ;
}
if(flag==1)
{
return ;
}
if(sum+a[step]<=k)
{
book[step]=1;
dfs(step+1,sum+a[step]);
book[step]=0;
}
dfs(step+1,sum);
}
}
int main()
{
while(cin>>n>>k)
{
flag=0;
memset(book,0,sizeof(book));
memset(a,0,sizeof(a));
int i,j;
for(i=0;i<n;i++)
cin>>a[i];
dfs(0,0);
if(flag==1)
{
cout<<"YES"<<endl;
for(i=0;i<n;i++)
{
if(book[i])
cout<<a[i]<<" ";
}
cout<<endl;
}
if(flag==0)
cout<<"NO"<<endl;
}
}
下面是AC的代码:
#include<iostream>
#include<string.h>
using namespace std;
int a[21],book[21];
int n,k,flag;
void dfs(int step,int sum)
{
int i;
if(step<=n)
{
if(sum>k)
return;
if(sum+a[step]<=k)
{
book[step]=1;
dfs(step+1,sum+a[step]);
book[step]=0;
}
dfs(step+1,sum);
if(sum==k&&flag==0)
{
flag=1;
cout<<"YES"<<endl;
for(i=0;i<n;i++)
{
if(book[i])
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}
if(flag==1)
{
return ;
}
}
}
int main()
{
while(cin>>n>>k)
{
flag=0;
memset(book,0,sizeof(book));
memset(a,0,sizeof(a));
int i,j;
for(i=0;i<n;i++)
cin>>a[i];
dfs(0,0);
if(flag==0)
cout<<"NO"<<endl;
}
}
仔细比较上面两断代码其实就是输出是不是放在DFS中而已,还是没怎么理解搜索的含义的,return 的意思是返回呀,即运行到这里,就不运行下去了,想到这里你想到了什么呢,,我之前就是有点吧RETURN 当初BREAK来看了,真是蛋疼呀。