DAY 75LeetCode 学习笔记

638. 大礼包

前言

今天的题目有点意思,看了半天才看懂,第二个礼包的list中的每个list,头几个是礼包中各个物品的数量,最后一个礼包价格,为此最低价格有两种策略,首先第一种是不购买礼包,直接使用needs和price相乘。另外一种是购买礼包,礼包的数量不能大于needs数量,所以这里需要一个判断,其次我们只要迭代的每次更新needs的数量就可以计算出来。
本次方法首先没有用map,单纯计算。加了一个map的原因是,减少检查,当needs的数量是出现过的,直接输出即可

题目

官方题目

源码

在这里插入图片描述

class Solution {
    public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
        Map<List<Integer>,Integer> map =new HashMap<>();
        return dfs(price,special,needs,map);
    }
    public int dfs(List<Integer>price,List<List<Integer>> special,List<Integer>needs,Map<List<Integer>,Integer> map){
        if(map.containsKey(needs)){
            return map.get(needs);
        }
        int res=multipy(needs,price);//不买礼包
        int j=0;
        for(List<Integer> s:special){
            List<Integer> clone_needs=new ArrayList<>(needs);
            for(j=0;j<needs.size();++j){
                int diff=needs.get(j)-s.get(j);//计算礼包中的数量和所需数量的差
                if(diff<0){//供大于求,砍掉方案
                    break;
                }
                clone_needs.set(j,diff);//更新needs
            }
            if(j==needs.size()){//若满足礼包每件商品都小于所需的数量
                res=Math.min(res,s.get(j)+dfs(price,special,clone_needs,map));//比较不需要礼包,和使用礼包的递归计算
            }
        }
        map.put(needs,res);
        return res;
    }
    public int multipy(List<Integer> a,List<Integer>b){
        int sum=0;
        for(int i=0;i<a.size();++i){
            sum += a.get(i)*b.get(i);
        }
        return sum;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值