题目
分析
用递归完成DFS即可。
下面递归代码的i表示当前配料的ID,x表示酸度,由于是×,初始1;y表示甜度,由于+,初值0。递归一定要让i>num,保证跑完一趟。
既然要求酸度和甜度的绝对差最小,那就在i>num,递归终止前比较更新一下min的值即可。
递归的时候在每次分叉的时候都要分别进行本次选和不选两种情况的递归,每次都分两种情况,类似搜索树,也正印证了本题是朴素的DFS递归搜索题。这里比较朴素,应该是O(2n)吧。
1<=N<=10,2^10=1024……
注意result要赋初值为0x3f3f3f3f,如果不管的话会得到42分。
代码
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);
}
}