分治dfs

图片说明

import java.util.*;

public class Main {

    static int max;
    static int n;
    static int a[];
    static int b[];
    public static void main(String[] args) {

        Scanner jin = new Scanner(System.in);
        n = jin.nextInt();
        a = new int[n+1];
        b = new int[n];
        for(int i=1;i<=n;i++) a[i] = jin.nextInt();
        for(int i=1;i<n;i++) b[i] = jin.nextInt();
        f(0, 0, 1);
        System.out.println(max);

    }

    public static void f(int num, int cs, int bs){
        if(num < 0){
            System.out.println(-1);
            System.exit(0);
        }
        if(bs == n){
            if(cs < 3)
                max = Math.max(max, num+a[n]);
            else
                max = Math.max(max, num);
            return;
        }

        if(num >= b[bs])  f(num-b[bs], cs, bs+1);
        if(cs < 3)  f(num+a[bs]-b[bs], cs+1, bs+1);

    }

}

这里用的分治法,开始理解错了题目,漏了一个小明只能选择三个补给点。

开始没有想到这个方法的参数是啥,1.num糖果的总数,2.cs也就是补给数(补给数不超过三个),3.下标。开始是没有糖果的,也没有拿到补给,下标从1开始。所以dfs(0,0,1),在dfs中,出口是num<0,当下标bs等于n的时候,那么就可以开始判断,如果补给数没有到3,那么可以直接拿最后一个补给,再同max比较,如果补给数到了3,那么就不能加上最后一个补给,直接和max比较。

接下来是分治法,两个判断条件,如果糖果数大于所需要的的糖果,那么就可以继续dfs,另一个就是如果补给站小于3,那么可以添加一个补给继续dfs。

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务