现在的位置: 首页 > 综合 > 正文

今天写dfs时发现到一个需要注意的问题

2012年09月17日 ⁄ 综合 ⁄ 共 1296字 ⁄ 字号 评论关闭

  今天数据结构实验课,老师给了一道题,说100分能用多少个1分,2分,5分组成,列出所有可能

     原本3个for就可以强搜索完, 最近由于搜索题做多了,上来直接想到用dfs做,后来写好了发现问题了

 

     dfs用于储存数据的数组,大小至少要把所有数据都能存进去,这题大小为100+50+20,但是仔细想会发现,答案最多不过为100个,开始我就把数组设为100个,运行起来爆了,调试,发现数组越界,就发现这个原因了,

     还有一个办法,在dfs再次操作时,判断len是否超了100,小于100继续,否则不继续,这样递归次数少了,这种方法更好,更快捷

     以后要注意这个问题

 

 

代码

1 #include<iostream>
2 #include<fstream>
3  using namespace std;
4
5  int usetimes[3] = {20, 50, 100};
6  int num[3] = {5, 2, 1};
7  int a[100];
8  int n = 0;
9
10  void dfs(int, int);
11
12  int main()
13 {
14
15 dfs(0, 0);
16 cout << n;
17
18 return 0;
19 }
20  int sum;
21
22  void dfs(int len, int current)
23 {
24 sum = 0;
25
26 for (int i = 0; i < len; i++)
27 sum += a[i];
28 if (sum == 100)
29 {
30 int b[3] = {0, 0, 0};
31
32 for (int i = 0; i < len; i++)
33 {
34 switch (a[i])
35 {
36 case 5: b[0]++; break;
37 case 2: b[1]++; break;
38 case 1: b[2]++; break;
39 }
40
41 }
42 printf("5*%d + 2*%d + 1*%d = 100\n", b[0], b[1], b[2]);
43 n++;
44 return ;
45 }
46
47 //注意这里,要判断len是否小于100,不然数组会越界
48 //dfs的时候,当不满足100的时候,大于100时也会继续,直到所有数值都用过,
49 //这里len最大去到20+50+100这么多
50   if (len < 100)
51 for (int i = current; i < 3; i++)
52 {
53 if (usetimes[i])
54 {
55 usetimes[i]--;
56 a[len] = num[i];
57 dfs(len+1, i);
58 usetimes[i]++;
59 }
60 }
61 }
62

 

 

3个for循环

代码

1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 int count = 0;
7 for (int i = 0; i <= 20; i++)
8 {
9 for (int j = 0; j <= 50; j++)
10 for (int k = 0; k <= 100; k++)
11 {
12 if (i*5 + j*2 + k*1 == 100)
13 {
14 printf("%d*5 + %d*2 + %d*1 = 100\n", i, j, k);
15 count++;
16 }
17 }
18 }
19 cout << count;
20 return 0;
21 }

 

 

抱歉!评论已关闭.