NYoj1058

水题,dfs,裸的,本来这道题没什么好写的,只是第一次写的代码慢的出奇,纪念一下那个奇怪的思路

链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1058

慢得出奇的代码,必须TLE:

 1
 2
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<string>
 7 #include<cmath>
 8 #include<algorithm>
 9 #include<vector>
10 using namespace std;
11 const int maxn=22;
12 int a[maxn];
13 int n;
14 int flag;
15 vector <int> p;
16 int t;
17 int c[maxn];
18 int j;
19 void dfs(int k,int *vis,int cur)
20 {
21     long long cnt=0;
22     if(cur==n)
23     {
24         int flag1=0;
25         for(int i=0;i<cur;i++)
26             if(vis[i])
27         {
28             cnt+=a[i];
29             if(cnt==k)
30             {
31                 flag=1;
32                 flag1=1;
33                 t=i;
34                 break;
35             }
36         }
37         if(flag1)
38         {
39              j=0;
40             for(int i=0;i<=t;i++)
41             {
42                 if(vis[i])
43                 c[j++]=i;
44             }
45            // p.clear();
46         }
47             return;
48     }
49     vis[cur]=1;
50     dfs(k,vis,cur+1);
51     vis[cur]=0;
52     dfs(k,vis,cur+1);
53 }
54 int main()
55 {
56     int k;
57     int vis[maxn];
58     while(scanf("%d",&n)!=EOF)
59     {
60         scanf("%d",&k);
61         for(int i=0;i<n;i++)
62             scanf("%d",&a[i]);
63         flag=0;
64         dfs(k,vis,0);
65         if(flag)
66         {
67             printf("YES\n");
68             for(int i=0;i<j-1;i++)
69                 printf("%d ",a[c[i]]);
70             printf("%d\n",a[c[j-1]]);
71         }
72         else
73             printf("NO\n");
74     }
75     return 0;
76 }
77                 

之后改良思路以后AC掉了,AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<vector>
 7 using namespace std;
 8 const int maxn=22;
 9 int a[maxn],vis[maxn];
10 int n,k;
11 bool dfs(int sum,int i)
12 {
13     if(i==n) return sum==k;
14     if(dfs(sum,i+1))
15     {
16         vis[i]=0;
17         return true;
18     }
19     if(dfs(sum+a[i],i+1))
20     {
21         vis[i]=1;
22         return true;
23     }
24     return false;
25 }
26 int main()
27 {
28     while(cin>>n>>k)
29     {
30         for(int i=0;i<n;i++)
31             scanf("%d",&a[i]);
32         memset(vis,0,sizeof(vis));
33         if(dfs(0,0))
34         {
35             printf("YES\n");
36             int k;
37             for(int i=0;i<22;i++)
38                 if(vis[i])
39             {
40                 k=i;
41                 printf("%d",a[i]);
42                 break;
43             }
44             for(int i=k+1;i<22;i++)
45                 if(vis[i])
46                 printf(" %d",a[i]);
47         }
48         else
49         {
50             printf("NO");
51         }
52         printf("\n");
53     }
54     return 0;
55 }

考研前最后一篇博客,博客园停止更新到12月28日,

时间: 2024-10-15 20:02:14

NYoj1058的相关文章

NYOJ-1058 部分和问题【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 代码:

NYOJ-1058 部分和问题

http://acm.nyist.net/JudgeOnline/problem.php?pid=1058 很简单的一道题,但是很久没有ac出来,看了别人的一下代码,发现就差一个变量的事儿,真是天壤之别啊. 程序17行 :原先 i 是从0开始的,提交后超时,变为从cur开始,顿时奇迹出现了.真是坑啊!!! 上代码: 1 #include <stdio.h> 2 int n,k; 3 int a[25],flag[25]; 4 int sum; 5 6 int DFS(int cur){///返

NYOJ-zb的生日

题目网址:http://acm.nyist.net/JudgeOnline/problem.php?pid=325 这道题解题的技巧类似NYOJ-1058部分和问题,就是代码第12行的位置:i 是从cur+1位置开始的. 这点是解决某一类问题的关键.此类题有一个共同之处就是:无序.拿这题来说就是:我从中选取一部分的数, 使得选中的和与剩下的和之差最小.我选中的这些数,不用管他的顺序怎么样,我直接从0位置开选就可以.如果 w[0]是问题解的一部分,那么我从剩下的再选即可.以w[0]为根的递归树中,

搜索学习(3)--NYOJ1058--部分和问题

挑战编程--初级篇:部分和问题(P30) 代码实现: //部分和问题: int a[maxn]; int n,m,i,j,k; bool dfs(int i,int sum) //已经从前i项得到了和sum,然后对于i项之后的进行分支 { if(i==n) return sum==k; //如果前n项都计算过了,则返回sum是否与k相等 if(dfs(i+1,sum)) return true;//不加上a[i]的情况 if(dfs(i+1,sum+a[i])) return true;//加上

种化选毛变花力型场金人里出成二经议

节去名什六识界半转度领除育火果青式张开入指包达界场格但变响军效市口形二传包火点导展多具书金设头她拉江规全求斯受风前整段小党点圆走百精已会林年具华料号北文取为格别金人团今学府道各置门 何点于影设阶无将温当积角新等型值头图体头通布声反委非传至门响从海这北子如调低例义自走干习性际力或权以铁是直具结切 布运广便调需打去活之下起识图问容里三土需容利张西四些程种圆其示只构局交相总王入圆社身火两除片车会间能共类区极况年府压看素系放参了局高影热问 口话度铁定国不治关来程党象之科一什精系公议需制命府一带使细意领构