zoukankan      html  css  js  c++  java
  • P2036 [COCI2008-2009#2] PERKET 深度搜索 暴力

    P2036 [COCI2008-2009#2] PERKET 深度搜索

    简单dfs,有所启发.

    对于每种食材都有取和不取两种情况,全都枚举并返回最终结果取最小值即可,注意题目要求不能一种食材都不要(bad).

    我的方法,dfs只有一个参数,但是用到了回溯.

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cmath>
    #include <iostream>
    using namespace std;
    
    int n;
    bool used[20];
    struct S
    {
        int a = -1, b = -1;
    }s[20];
    
    int dfs(int pos)
    {
        if(s[pos].a != -1)
        {
            used[pos] = true;
            int y = dfs(pos + 1);
            used[pos] = false;
            int n = dfs(pos + 1);
            return min(y, n);
        }else
        {
            bool bad = true;
            int suan = 1;
            int ku = 0;
            for(int i = 0; i < n; i++)
                if(used[i])
                {
                    suan *= s[i].a;
                    ku += s[i].b;
                    bad = false;
                }
            if(bad)
                return 1000000001;
            else
                return abs(suan - ku);
        }
    }
    
    int main()
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> s[i].a >> s[i].b;
        s[n].a = -1;
    
        printf("%d
    ", dfs(0));
    
        return 0;
    }

    题解参观了一遍发现一个简洁地多的写法:

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int M=15;//养成良好习惯
    int a[M],b[M],n,ans=0x7fffffff;
    //ans初始化为最大值
    void dfs(int i,int x,int y){
    //i是表示目前的配料编号,x为酸度,y为甜度
        if(i>n){
            //注意,必须大于n才表示全部搜完
            if(x==1&&y==0)return;
            //判断清水的情况
            ans=min(abs(x-y),ans);
            //更新ans
            return;
        }
        //分两种情况搜索:1添加 2不添加
        dfs(i+1,x*a[i],y+b[i]);
        dfs(i+1,x,y); 
        //这题无需回溯,不明白为何有些题解居然还用全局变量,非得回溯-_-||
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i],&b[i]);
            //读入,用cin太慢了
        }
        dfs(1,1,0);
        printf("%d
    ",ans);
        return 0;
    }

    (转载于https://dfsupdp01.blog.luogu.org/solution-p2036)

    这样的思想就是在递归时不停传递和更新过程值,直到最后一步再进行不方便在过程中直接进行的运算.这种设计免去了额外的数组(used[]),简洁的多.

    所以说,dfs参数的设计是要有取舍的,这里有可能会形成更加简洁的实现.

  • 相关阅读:
    docker创建tomcat容器
    【转载】张一鸣:为什么 BAT 挖不走我们的人才?
    Elastic认证考试,请先看这一篇
    vs code 初始化vue项目框架
    Idea集成git常用命令
    pxc搭建mysql集群
    mysql无限级分类
    Java面试题大全
    SpringMVC和Spring
    Redis高级特性
  • 原文地址:https://www.cnblogs.com/Gaomez/p/14026431.html
Copyright © 2011-2022 走看看