深度优先搜索(Depth First Search)
Date:2019-07-01 15:31:11
- 通俗点理解就是不撞南墙不回头的那种,用栈来实现
算法实现
1 /* 2 题目描述: 3 有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干件物品放入一个容量为V的背包中, 4 使得在选入背包的物品重量之和不超过V的前提下,让背包中物品的价格之和最大,求最大价值(1<=n<=20)。 5 6 Sample input: 7 5 8 //n=5,V=8 8 3 5 1 2 2 //w[i] 9 4 5 2 1 3 //c[i] 10 Sample output: 11 10 12 */ 13 14 #include <cstdio> 15 const int MAX_SIZE = 30; 16 int n, V, maxValue = 0; 17 int w[MAX_SIZE], c[MAX_SIZE]; 18 19 void DFS(int index, int sumW, int sumC) 20 { 21 if(index == n) 22 return ; 23 DFS(index+1, sumW, sumC); //index不放入背包中 24 if(sumW + w[index] <= V) //剪枝:通过题目条件的限制来减少DFS的计算量 25 { 26 if(sumC + c[index] > maxValue) 27 maxValue = sumC + c[index]; 28 DFS(index+1, sumW+w[index], sumC+c[index]); //index放入背包中 29 } 30 } 31 32 int main() 33 { 34 freopen("Test.txt", "r", stdin); 35 scanf("%d%d", &n, &V); 36 for(int i=0; i<n; i++) 37 scanf("%d", &w[i]); 38 for(int i=0; i<n; i++) 39 scanf("%d", &c[i]); 40 DFS(0,0,0); //初始条件 41 printf("%d\n", maxValue); 42 } 43 44 45 /* 46 题目描述: 47 给定N个整数(可能有负数),从中选择K个数,使得这K个数之和恰好等于一个给定的整数X; 48 如果有多种方案,选择他们中元素平方和最大的一个。数据保证方案唯一。 49 Input Specification: 50 从4个整数{2,3,3,4}中选择2个数,使它们的和为6,显然有两种方案{2,4},{3,3},其中{2,4}平方和最大。 51 */ 52 53 //序列A中n个数里选择k个数使得和为x,最大平方和为maxSumSqu 54 int n, k, x, maxSumSqu=-1, A[maxn]; 55 //temp存放临时方案,ans存放平方和最大方案 56 vector<int> temp, ans; 57 58 //当前处理index号整数,当前已选整数个数为nowK 59 //当前已选整数之和为sum,当前已选整数平方和为sumSqu 60 void DFS(int index, int nowK, int sum, int sumSqu) 61 { 62 if(nowK==k && sum==x) 63 { 64 if(sumSqu > maxSumSqu) 65 { 66 maxSumSqu = sumSqu; 67 ans = temp; 68 } 69 return ; 70 } 71 72 //已经处理完n个数,或者超过k个数,或者和超过x,返回 73 if(index==n || nowK>k || sum>x) 74 return ; 75 //选index号数 76 temp.push_back(A[index]); 77 //若可以重复选择数字,则把index+1改为index即可,即index号数字可以重复选择 78 DFS(index+1, nowK+1, sum+A[index], sumSqu+A[index]*A[index]); 79 temp.pop_back(); 80 //不选index号数 81 DFS(index+1, nowK, sum, sumSqu); 82 }