装背包 --- 深度优先搜索时间复杂度 ... 线性搜索
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\n"); 46 } 47 else 48 printf("N\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\n"); 46 } 47 else 48 printf("N\n"); 49 } 50 return 0; 51 }