部分和问题 南阳acm1058(递归+dfs)

部分和问题

时间限制: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
来源
经典题目
上传者
TC_杨闯亮
简单的搜索问题,要注意它有多组测试数据

 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[22],b[22];
 4 int n,k,flag;
 5 void dfs(int x,int sum)
 6 {
 7     int i;
 8     if(sum > k) return;    //此时不需要再相加了,已经超了
 9     if(x==n)
10     {
11         if(sum == k)
12         {
13             flag = 1;
14             printf("YES\n");
15             for(i=0; i<n; i++)
16             {
17                 if(b[i]) printf("%d ",a[i]);
18             }
19             printf("\n");
20             return;
21         }
22         return;
23     }
24     b[x] = 0;
25     dfs(x+1,sum);    //sum不需要+a[x]时,b[x] = 0
26     b[x] = 1;
27     dfs(x+1,sum+a[x]);    //sum+a[x]时,b[x] = 1
28 }
29 int main()
30 {
31     int i;
32     while(scanf("%d%d",&n,&k)!=EOF)
33     {
34             flag = 0;
35             memset(b,0,sizeof(b));
36         for(i=0; i<n; i++)
37             scanf("%d",&a[i]);
38         dfs(0,0);
39         if(!flag)
40             printf("NO\n");
41     }
42     return 0;
43 }

原文地址:https://www.cnblogs.com/-skyblue/p/9350864.html

时间: 2024-10-12 05:32:23

部分和问题 南阳acm1058(递归+dfs)的相关文章

组合数 南阳oj32【DFS】

描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 #include <stdio.h> #include<string.h> int m,n; int vis[20]; int res[20

B. Nirvana Codeforces Round #549 (Div. 2) (递归dfs)

---恢复内容开始--- Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt find the maximum possible product of digits among all integers from 1 to n. Input

深度搜索入门

深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态,直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此重复,直到找到最终的解. 做这类题目,抓住两样东西:1.总体上递归几次(几层)?每一次递归确定一层上的数. 2.每次递归,有几种选择的情况.所以dfs()函数,只有两部分(if.else结构):1.(if部分)若每一层都选择了,判断是否符合条件,做出题目要求的操作.2.(else部分)若还有层没有选择,就做出选择,所有选择的情况列出. 下面是几个考察dfs的题目: 1.部

UVa 548 Tree(建树,递归遍历)

题意  给你一个树的中序遍历和后序遍历  某个节点的权值为从根节点到该节点所经过节点的和  求权值最小的叶节点的值  如果存在多个  输出值最小的那个 把树建好就好说了  递归递归dfs msun保存最小叶节点权值  ans保存答案 #include<cstdio> #include<cctype> #include<cstring> using namespace std; const int maxn = 10005, INF = 0x3f3f3f3f; int i

BZOJ-1103 [POI2007]大都市meg 【DFS序+树状数组】

Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径到达村庄1(即比特堡).并且,对于每个村庄,它到比特堡的路径恰好 只经过编号比它的编号小的村庄.另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇.在这个未开 化的地方,从来没有过高架桥和地下铁道.随着时间的推移,越来

DFS应用:全排列

思路:好好利用递归DFS. 1 #include<cstdio> 2 bool flag[100]={ 3 false 4 }; 5 int ans[100]; 6 void DFS(int i,int n,int level) 7 { 8 flag[i]=true; 9 if(level==n) 10 { 11 ans[level]=i; 12 for(int i=1;i<=n;i++) 13 { 14 if(i!=n) 15 printf("%d ",ans[i]

USACO-Section 2.1 The Castle(DFS)

描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰"(一种彩票).结果这张彩票让他获得了这次比赛唯一的奖品--坐落于爱尔兰郊外的一座梦幻般的城堡! 喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关于他城堡的一切.他需要做一些吹嘘前的准备工作:比如说知道城堡有多少个房间,每个房间有多大.另外,农夫约翰想要把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房

南阳理工ACM42——一笔画问题

一笔画问题,也就是欧拉道路,这一题,简单的欧拉回路的应用. 什么是欧拉回路? 欧拉回路就是在图A中,存在一条路径使得每一条边都走过一次,并且这条路径是一个圈,就是欧拉回路. 欧拉回路的判断: 1.在有向图中:首先必要的条件是图连通,所以顶点的入度都等于出度. 2.在无向图中:首要条件还是图连通,其次就是所以顶点都是偶数度(该顶点的度为偶数) 这一题,还需要加上一个条件,也就是存在两个奇数度的点的情况,也是符合的,从一个奇数点出发,另外一个奇数点结束. 判断图是否连通,可以运用DFS或者并查集,都

I - 天平 (p157,二叉树的 DFS) UVA - 839

题目 输入一个树状天平,根据力矩相等原则判断是否平衡.如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离.采用递归(先序)方式输入:每个天平的格式为Wl,Dl,Wr,Dr,当Wl或Wr为0时,表示该"砝码"实际是一个子天平,接下来会描述这个子天平.当Wl=Wr=0时,会先描述左子天平,然后是右子天平. 样例输入: 10 2 0 40 3 0 11 1 1 12 4 4 21 6 3 2 输出YES 我还是按照上一节数组记录结点的方法做