【力扣·每日一题】1774. 最接近目标价格的甜点成本 (dfs搜索 动态规划 Go)

题目链接

题意

你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则:

必须选择 一种 冰激凌基料。
可以添加 一种或多种 配料,也可以不添加任何配料。
每种类型的配料 最多两份 。
给你以下三个输入:

baseCosts ,一个长度为 n 的整数数组,其中每个 baseCosts[i] 表示第 i 种冰激凌基料的价格。
toppingCosts,一个长度为 m 的整数数组,其中每个 toppingCosts[i] 表示 一份 第 i 种冰激凌配料的价格。
target ,一个整数,表示你制作甜点的目标价格。
你希望自己做的甜点总成本尽可能接近目标价格 target 。

返回最接近 target 的甜点成本。如果有多种方案,返回 成本相对较低 的一种。

思路

思路1:
n,m只有10,所以采用dfs或状态压缩枚举遍历每一种可能性。边界条件为把所有的配料枚举完。每次记录一下当前做的甜点的成本,维护最接近target的。
时间复杂度 O ( n ∗ 3 m ) O(n*3^m) O(n3m)
思路2:
实际上是个背包问题

代码

var ans int
var target int 
var toppingCosts []int

func abs(x int) int {
    if x >= 0 {
        return x
    }
    return -x
}

func dfs(cnt, now int) {
   if abs(ans-target) >= abs(now-target) {
        if  abs(ans-target) > abs(now-target) {
            ans = now
        }else{
            if ans > now {
                ans = now
            }
        }
    }
    if cnt == len(toppingCosts) {
        return 
    }
    dfs(cnt+1,now+toppingCosts[cnt]*2)
    dfs(cnt+1,now+toppingCosts[cnt])
    dfs(cnt+1,now)
}

func closestCost(baseCosts []int, toppingCosts1 []int, target1 int) int {
    target = target1
    toppingCosts = toppingCosts1
    //回溯
    ans = 100000
    for _,val := range baseCosts {
        if ans > val {
            ans = val
        }
    }
    for _,val := range baseCosts {
        dfs(0,val)
    }
    return ans
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值