部分和问题 nyoj

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分和问题 nyoj相关的知识,希望对你有一定的参考价值。

部分和问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述
给定整数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 <cstring>
using namespace std;

int a[25],visit[25],sum,sum1,n,flag;
void DFS(int location)
{
if(flag==1) //找到之后按层依次返回
return;
if(sum<=sum1)
{
if(sum==sum1)
{
flag=1;
cout<<"YES"<<endl;
for(int i=0;i<n;i++)
if(visit[i]==1) //选中标记的输出
cout<<a[i]<<" ";
cout<<endl;
}
return;
}
for(int i=location;i<n;i++)
{
sum1+=a[i]; //选中第i个元素
visit[i]=1; //标记第i个元素
DFS(i+1); //向下搜索
sum1-=a[i]; //不选第i个元素
visit[i]=0; //解除标记
}
}

int main()
{
while(cin>>n>>sum)
{
sum1=0;
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
cin>>a[i];
flag=0;
DFS(0);
if(!flag)
cout<<"NO"<<endl;
}
return 0;
}

以上是关于部分和问题 nyoj的主要内容,如果未能解决你的问题,请参考以下文章

部分和问题 nyoj

NYOJ-zb的生日

nyoj 1058部分和问题

NYOJ-1058 部分和问题DFS

argparse 代码片段只打印部分日志

nyoj 94-cigarettes (分清楚,那一部分的cigarettes是用过的,那一部分是没有用过的)