子集和问题的一个实例为<S,t>。其中,S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得
试设计一个解子集和问题的回溯法。
对于给定的正整数的集合S和正整数c,计算S的一个子集S1使得
标签:code 子集和 pac cstring page sub mst name 实现
子集和问题的一个实例为<S,t>。其中,S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得
试设计一个解子集和问题的回溯法。
对于给定的正整数的集合S和正整数c,计算S的一个子集S1使得
第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的1行中,有n个正整数,表示集合S中的元素。
将子集和问题的解输出。当问题无解时,输出“Solution!”。
5 10 2 2 6 5 4
2 2 6
C/C++ 代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <climits> 10 11 using namespace std; 12 const int MAX = 1e6 + 10; 13 int A[MAX], ANS[MAX], n, m, N, flag = 0, my_book[MAX] = {0}; 14 15 void dfs(int cnt, int step) 16 { 17 if (cnt == m) 18 { 19 N = step; 20 flag = 1; 21 return ; 22 } 23 if (cnt > m) return ; 24 for (int i = 0; i < n; ++ i) 25 { 26 if (my_book[i]) continue; 27 if (flag) return ; 28 my_book[i] = 1; 29 ANS[step] = A[i]; 30 dfs(cnt + A[i], step + 1); 31 my_book[i] = 0; 32 } 33 } 34 35 int main() 36 { 37 cin >>n >>m; 38 for (int i = 0; i < n; ++ i) 39 { 40 scanf("%d", &A[i]); 41 } 42 dfs(0, 0); 43 if (!flag) cout <<"Solution!" <<endl; 44 else 45 { 46 for (int i = 0; i < N - 1; ++ i) 47 cout <<ANS[i] <<" "; 48 cout <<ANS[N - 1] <<endl; 49 } 50 return 0; 51 }
标签:code 子集和 pac cstring page sub mst name 实现
原文地址:https://www.cnblogs.com/GetcharZp/p/9162503.html