1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 #include<vector>
8 #include<set>
9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 using namespace std;
15 int a[1025],n,sum,s[1025];
16 bool DFS(int i,int m)
17 {
18 if(i==n)
19 return sum==m;
20 else
21 if(sum<m||m+s[n]-s[i]<sum) // 在线性搜索 中 这里是以一个 十分重要的 剪枝 地点 // 检查剩下 的 所有数字 之和 + 已经有 的 数字 看看 够不够 目标的值
22 return false; // 如果 不够 的 话 就 直接 剪掉 // 节省时间 大大滴
23 if(DFS(i+1,m))
24 return true;
25 if(DFS(i+1,a[i]+m))
26 {
27 return true;
28 }
29 return false;
30 }
31 int main()
32 {
33 int t;
34 scanf("%d",&t);
35 while(t--)
36 {
37 scanf("%d%d",&n,&sum);
38 for(int i=0;i<n;i++)
39 {
40 scanf("%d",&a[i]);
41 s[i+1]=s[i]+a[i];
42 }
43 if(DFS(0,0))
44 {
45 printf("Y
");
46 }
47 else
48 printf("N
");
49 }
50 return 0;
51 }
线性搜索中的 一个神级优化 ..
一个神级搜索 线性搜索剪枝
下面附上 代码
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 #include<vector>
8 #include<set>
9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 using namespace std;
15 int a[1025],n,sum,s[1025];
16 bool DFS(int i,int m)
17 {
18 if(i==n)
19 return sum==m;
20 else
21 if(sum<m||m+s[n]-s[i]<sum) // 在线性搜索 中 这里是以一个 十分重要的 剪枝 地点 // 检查剩下 的 所有数字 之和 + 已经有 的 数字 看看 够不够 目标的值
22 return false; // 如果 不够 的 话 就 直接 剪掉 // 节省时间 大大滴
23 if(DFS(i+1,m))
24 return true;
25 if(DFS(i+1,a[i]+m))
26 {
27 return true;
28 }
29 return false;
30 }
31 int main()
32 {
33 int t;
34 scanf("%d",&t);
35 while(t--)
36 {
37 scanf("%d%d",&n,&sum);
38 for(int i=0;i<n;i++)
39 {
40 scanf("%d",&a[i]);
41 s[i+1]=s[i]+a[i];
42 }
43 if(DFS(0,0))
44 {
45 printf("Y
");
46 }
47 else
48 printf("N
");
49 }
50 return 0;
51 }