酸甜可口的“Perket”(洛谷P2036题题解,Java语言描述)

题目要求

P2036题目链接

酸甜可口的“Perket”(洛谷P2036题题解,Java语言描述)_第1张图片

分析

这是一个入坑级的DFS题

用递归完成DFS即可。
下面递归代码的i表示当前配料的ID,因为要逐一尝试的嘛。x表示酸度,由于是×,初始1;y表示甜度,由于+,初值0。递归的终结篇一定要让i>num,保证跑完一趟。
既然要求酸度和甜度的绝对差最小,那就在i>num,递归终止前比较更新一下min的值就好啦。
递归的时候在每次分叉的时候都要分别进行本次选和不选两种情况的递归,每次都分两种情况,类似搜索树,也正印证了本题是朴素的DFS递归搜索题(当然也可以不用递归啦)。这里比较朴素,应该是O(2n)吧,毕竟没法去剪枝啥的,你不到最后也不知道结果是怎样的呀Orz……
1<=N<=10,210=1024,炸不了的,完美……

很恶心的一点是result要赋初值为0x3f3f3f3f,当然可以有很多种赋值,如果不管的话会得到42分,WA到自闭。

看这位大佬的博客,也可提供另一种思路 → 位运算解法

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {

    private static int[] acidity_array;

    private static int[] sweetness_array;

    private static int num;

    private static long result = 0x3f3f3f3f;

    private static void dfs(int i, long x, long y) {
        if(i > num){
            if(x!=1 || y!=0) {
                result = Math.min(Math.abs(x-y), result);
            }
            return;
        }
        //添加的情况
        dfs(i + 1, x * acidity_array[i], y + sweetness_array[i]);
        //不添加的情况
        dfs(i + 1, x, y);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        num = scanner.nextInt();
        acidity_array = new int[num+1];
        sweetness_array = new int[num+1];
        for (int i = 1; i <= num; i++) {
            acidity_array[i] = scanner.nextInt();
            sweetness_array[i] = scanner.nextInt();
        }
        scanner.close();
        dfs(1, 1, 0);
        System.out.println(result);
    }

}

你可能感兴趣的:(#,Algorithm-LuoGu,#)