1774.最接近目标价格的甜点成本

方法一:回溯

暴力回溯,设 baseCosts 长度为 ntoppingCosts 长度为 m,则时间复杂度 $O(n \times 3^m)$,空间复杂度 $O(m)$。

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}

func closestCost(baseCosts []int, toppingCosts []int, target int) int {
	ans, m := 10001, len(toppingCosts)
	// 此处使 ans 为 baseCosts 的最小值的原因是:
	// 若 ans ≥ target,则无论我们是否添加配料都不会使甜品制作的开销与目标价格 target 的距离缩小,所以此时直接返回此最小的基料开销即可
	for _, v := range baseCosts {
		ans = min(v, ans)
	}
	var backtrack func(start, sum int)
	backtrack = func(start, sum int) {
		if abs(ans-target) >= abs(sum-target) {
			if abs(ans-target) > abs(sum-target) {
				ans = sum
			} else {
				ans = min(ans, sum)
			}
		} else if abs(ans-target) < sum-target {
			return
		}
		if start >= m {
			return
		}

		backtrack(start+1, sum)
		backtrack(start+1, sum+toppingCosts[start])
		backtrack(start+1, sum+toppingCosts[start]*2)
	}
	for _, v := range baseCosts {
		backtrack(0, v)
	}
	return ans
}