zoukankan      html  css  js  c++  java
  • 装背包 --- 深度优先搜索时间复杂度 ... 线性搜索

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<vector>
     8 #include<set>
     9 #include<stack>
    10 #include<string>
    11 #include<sstream>
    12 #include<map>
    13 #include<cctype>
    14 using namespace std;
    15 int a[1025],n,sum,s[1025];
    16 bool DFS(int i,int m)
    17 {
    18     if(i==n)
    19         return sum==m;
    20     else
    21         if(sum<m||m+s[n]-s[i]<sum)     //   在线性搜索  中  这里是以一个 十分重要的  剪枝  地点  //   检查剩下 的  所有数字  之和   +   已经有 的  数字  看看  够不够     目标的值  
    22         return false;               //  如果 不够   的  话     就   直接  剪掉    //     节省时间  大大滴          
    23     if(DFS(i+1,m))
    24         return true;
    25     if(DFS(i+1,a[i]+m))
    26     {
    27         return true;
    28     }
    29     return false;
    30 }
    31 int main()
    32 {
    33     int t;
    34     scanf("%d",&t);
    35     while(t--)
    36     {
    37         scanf("%d%d",&n,&sum);
    38         for(int i=0;i<n;i++)
    39         {
    40             scanf("%d",&a[i]);
    41             s[i+1]=s[i]+a[i];
    42         }
    43         if(DFS(0,0))
    44         {
    45             printf("Y
    ");
    46         }
    47         else
    48             printf("N
    ");
    49     }
    50     return 0;
    51 }

    线性搜索中的  一个神级优化  ..          

    一个神级搜索 线性搜索剪枝

    下面附上 代码

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<vector>
     8 #include<set>
     9 #include<stack>
    10 #include<string>
    11 #include<sstream>
    12 #include<map>
    13 #include<cctype>
    14 using namespace std;
    15 int a[1025],n,sum,s[1025];
    16 bool DFS(int i,int m)
    17 {
    18     if(i==n)
    19         return sum==m;
    20     else
    21         if(sum<m||m+s[n]-s[i]<sum)     //   在线性搜索  中  这里是以一个 十分重要的  剪枝  地点  //   检查剩下 的  所有数字  之和   +   已经有 的  数字  看看  够不够     目标的值  
    22         return false;               //  如果 不够   的  话     就   直接  剪掉    //     节省时间  大大滴          
    23     if(DFS(i+1,m))
    24         return true;
    25     if(DFS(i+1,a[i]+m))
    26     {
    27         return true;
    28     }
    29     return false;
    30 }
    31 int main()
    32 {
    33     int t;
    34     scanf("%d",&t);
    35     while(t--)
    36     {
    37         scanf("%d%d",&n,&sum);
    38         for(int i=0;i<n;i++)
    39         {
    40             scanf("%d",&a[i]);
    41             s[i+1]=s[i]+a[i];
    42         }
    43         if(DFS(0,0))
    44         {
    45             printf("Y
    ");
    46         }
    47         else
    48             printf("N
    ");
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    Mac + Python3 安装scrapy
    Pyqt4+Eric6+python2.7.13(windows)
    js基础⑥
    python模块之os,sys
    Python模块之random
    Python模块之PIL
    js基础⑤
    js基础④
    js基础③
    centOS目录结构详细版
  • 原文地址:https://www.cnblogs.com/A-FM/p/5355336.html
Copyright © 2011-2022 走看看