0
点赞
收藏
分享

微信扫一扫

部分和问题(南阳oj1058)(DFS)


部分和问题



1000 ms  |  内存限制: 65535



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<stdio.h>
int n,k,a[30],visit[30],ans,ok;
int dfs(int pos)
{
if(ans>=k)
{
if(ans==k)
{
if(!ok){
ok=1;printf("YES\n");
}
for(int i=0;i<n;i++)
if(visit[i]) printf("%d ",a[i]);
printf("\n");
}
return ok;
}
for(int i=pos;i<n;i++)
{
ans+=a[i];
visit[i]=1;
dfs(i+1);
ans-=a[i];
visit[i]=0;
}
}
int main()
{
while(scanf("%d %d",&n,&k)==2)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
visit[i]=0;
}
ok=ans=0;
dfs(0);
if(!ok)
printf("NO\n");
}
return 0;
}


举报

相关推荐

0 条评论