zoukankan      html  css  js  c++  java
  • 深度优先搜索

    深度优先搜索(DFS, Depth-First Search)是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后退到前一步的状态,如此不断重复,直至找到最终的解。

    部分和问题

    给定整数a1、a2、……、an,判断是否可以从中选出若干个数,使它们的和恰好为k。

    限制条件

    • 1 ≤ n ≤ 20
    • -10≤ ai ≤ 108
    • -10≤ k ≤ 108

    输入

    n = 4

    a = {1,2,4,7}

    k =13

    输出

    Yes

    从a1开始按顺序决定每个数加或不加,在全部n个数都决定后再判断它们的和是不是k即可。因为状态数是2n+1,所以复杂度是O(2n)。代码如下:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 int n, k;
     6 vector<int> a;
     7 
     8 //已经从前i项得到了sum,然后对于i项之后的进行分支
     9 bool dfs(int i, int sum)
    10 {
    11     //如果前n项都计算过了,则返回sum是否与k相等
    12     if (i == n) return sum == k;
    13 
    14     //不加上a[i]的情况
    15     if (dfs(i+1, sum)) return true;
    16 
    17     //加上a[i]的情况
    18     if (dfs(i+1, sum+a[i])) return true;
    19 
    20     //无论是否加上a[i]都不能凑成k就返回false
    21     return false;
    22 }
    23 
    24 int main()
    25 {
    26     while (cin >> n)
    27     {
    28         int tmp;
    29         for (int i = 0; i < n; i++)
    30         {
    31             cin >> tmp;
    32             a.push_back(tmp);
    33         }
    34         cin >> k;
    35         if (dfs(0, 0))
    36             cout << "Yes" << endl;
    37         else
    38             cout << "No" << endl;
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/bournet/p/3995653.html
Copyright © 2011-2022 走看看