装背包 --- 深度优先搜索时间复杂度 ... 线性搜索

 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 }
原文地址:https://www.cnblogs.com/A-FM/p/5355336.html