• 装背包 --- 深度优先搜索时间复杂度 ... 线性搜索


     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 }
  • 相关阅读:
    Leetcode 126.单词接龙II
    Leetcode 125.验证回文串
    Leetcode 124.二叉树中的最大路径和
    Leetcode 123.买卖股票的最佳时机III
    Leetcode 122.买卖股票的最佳时机II
    西子凌波回复集5(网友整理版)
    西子凌波回复集4(网友整理版)
    西子凌波回复集3(网友整理版)
    K杀(逻辑-标准-规则)
    西子凌波49:2018年11月29日微博解盘提示
  • 原文地址:https://www.cnblogs.com/A-FM/p/5355336.html
Copyright © 2020-2023  润新知