深度优先搜索(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 }

 

posted @ 2019-07-01 15:36  林東雨  阅读(1462)  评论(0编辑  收藏  举报