您的位置:首页 > 其它

nyoj 部分和问题(深度优先搜索DFS)

2016-11-29 15:36 363 查看

部分和问题(入门题)

描述

给你n个数(a1,a2,a3.......an) ,是否存在某一些数字加起来等于k,有就输出 "YES",否则输出 "NO"。

数据范围:n<20;

a1+a2+....an在int范围里面.

输入多组输入

每组第一行输入两个数n,k

第二行输入n个数a1 a2 ...... an
输出如果存在一些数加起来为k输出"YES";否则输出"NO".
样例输入
5 6
2 3 5 2 1
3 6
2 3 9


样例输出
YES
NO


[align=left]代码:[/align]
#include<iostream>
#include<stack>
using namespace std;
int a[25],n,k;
int dfs(int i,int sum)
{
if(sum>k)//进行剪枝
return 0;
if(i==n)
return sum==k?1:0;//当i等于n时,返回sum是否等于k
if(dfs(i+1,sum))//不加a[i]
return 1;
if(dfs(i+1,sum+a[i]))//加上a[i]
return 1;
return 0;
}
int main()
{
while(cin>>n>>k)
{
int i;
for(i=0;i<n;i++)
cin>>a[i];
if(dfs(0,0))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}

[align=left][/align]

                                                                        部分和问题

[align=left]描述[/align]
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。

输入首先,n和k,n表示数的个数,k表示数的和。

接着一行n个数。

(1<=n<=20,保证不超int范围)
输出如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 13
1 2 4 7


样例输出
YES
2 4 7
代码:

#include<iostream>
#include<stack>
using namespace std;
int a[25],n,k;
stack<int>s;
int dfs(int i,int sum)
{
if(sum>k)//进行剪枝
return 0;
if(i==n)//i等于n时,开始回溯
return sum==k;//当i等于n时,返回sum是否等于k
if(dfs(i+1,sum))//返回不加a[i]的情况
return 1;
if(dfs(i+1,sum+a[i]))//返回加上a[i]的情况
{
s.push(a[i]);
return 1;
}
return 0;//当最后最后无论如何都凑不成k时,返回0
}
int main()
{
while(cin>>n>>k)
{
while(!s.empty())
s.pop();//对栈清零
int i;
for(i=0;i<n;i++)
cin>>a[i];
if(dfs(0,0))
{
cout<<"YES"<<endl;
while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}

      ps:深度优先搜索的入门题目,总算是明白了一点点深搜的奥妙,就从它开始打开搜索的大门

。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: