Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers)

深度优先搜索的解题详细介绍,点击


  1. LeetCode商店中, 有许多在售的物品。
  2.  
  3. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。
  4.  
  5. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。
  6.  
  7. 每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。
  8.  
  9. 任意大礼包可无限次购买。
  10.  
  11. 示例 1:
  12.  
  13. 输入: [2,5], [[3,0,5],[1,2,10]], [3,2]
  14. 输出: 14
  15. 解释:
  16. AB两种物品,价格分别为¥2和¥5
  17. 大礼包1,你可以以¥5的价格购买3A0B
  18. 大礼包2 你可以以¥10的价格购买1A2B
  19. 你需要购买3A2B 所以你付了¥10购买了1A2B(大礼包2),以及¥4购买2A
  20. 示例 2:
  21.  
  22. 输入: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]
  23. 输出: 11
  24. 解释:
  25. ABC的价格分别为¥2,¥3,¥4.
  26. 你可以用¥4购买1A1B,也可以用¥9购买2A2B1C
  27. 你需要买1A2B1C,所以你付了¥4买了1A1B(大礼包1),以及¥3购买1B ¥4购买1C
  28. 你不可以购买超出待购清单的物品,尽管购买大礼包2更加便宜。
  29. 说明:
  30.  
  31. 最多6种物品, 100种大礼包。
  32. 每种物品,你最多只需要购买6个。
  33. 你不可以购买超出待购清单的物品,即使更便宜。

分析:

给定N个商品,给定M个长度为N+1的礼包,并给定长度为N的List来存储每个商品需要几个,求怎样购买价格最低。

例子看示例1.

这个问题可以转化为:

1、先求出我最多可以买几个该礼包?

2、循环 0-最大购买数量 次,即购买该礼包 0次到最大购买次数个

  举个例子,A礼包我最多可以买2个,那么我DFS进入到以下几个步骤:

  •   购买0个A礼包 -> 购买B礼包
  •   购买1个A礼包 -> 购买B礼包
  •   购买2个A礼包 -> 购买B礼包

3、循环到礼包列表的最末端后,检查有哪些商品是目前还缺的,把缺的商品,以其单价购买。

4、最后再计算总价,求出最小值。

AC代码:

  1. class Solution {
  2. int ans = Integer.MAX_VALUE;
  3. public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
  4. if(price.size()==0 || price==null) return 0;
  5. dfs(price,special,needs,0,0);
  6. return ans;
  7. }
  8. public void dfs(List<Integer> price,List<List<Integer>> special,List<Integer> needs,int step,int money){
  9. if(step>=special.size()){
  10. for (int i = 0; i < needs.size(); i++) {
  11. money += needs.get(i)*price.get(i);
  12. }
  13. ans = Math.min(ans, money);
  14. return;
  15. }
  16.  
  17. List<Integer> pack = special.get(step);
  18. int value = pack.get(pack.size()-1);
  19. int maxNum = Integer.MAX_VALUE;
  20. for(int i=0;i<needs.size();i++){
  21. if(pack.get(i)!=0){
  22. int temp = needs.get(i)/pack.get(i);
  23. maxNum = Math.min(maxNum, temp);
  24. }
  25. }
  26. for(int i=0;i<=maxNum;i++){
  27. List<Integer> temp = new ArrayList<>(needs);
  28. for(int j=0;j<needs.size();j++){
  29. needs.set(j, needs.get(j)-i*pack.get(j));
  30. }
  31. int cost = i*value;
  32. if(money+cost<ans){
  33. dfs(price,special,needs,step+1,money+cost);
  34. }
  35. needs = new ArrayList<>(temp);
  36. }
  37.  
  38. }
  39. }

Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers)的更多相关文章

  1. Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences)

    Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences) 深度优先搜索的解题详细介绍,点击 给定一个整型数组, 你的任务是找到所有该数组 ...

  2. Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III)

    Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III) 深度优先搜索的解题详细介绍,点击 在二维网格 grid 上,有 4 种类型的方格: 1 ...

  3. Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

    Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...

  4. Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)

    Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...

  5. Leetcode之深度优先搜索(DFS)专题-199. 二叉树的右视图(Binary Tree Right Side View)

    Leetcode之深度优先搜索(DFS)专题-199. 二叉树的右视图(Binary Tree Right Side View) 深度优先搜索的解题详细介绍,点击 给定一棵二叉树,想象自己站在它的右侧 ...

  6. Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree)

    Leetcode之深度优先搜索(DFS)专题-559. N叉树的最大深度(Maximum Depth of N-ary Tree) 深度优先搜索的解题详细介绍,点击 给定一个 N 叉树,找到其最大深度 ...

  7. Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves)

    Leetcode之深度优先搜索(DFS)专题-1020. 飞地的数量(Number of Enclaves) 深度优先搜索的解题详细介绍,点击 给出一个二维数组 A,每个单元格为 0(代表海)或 1( ...

  8. Leetcode之深度优先搜索(DFS)专题-690. 员工的重要性(Employee Importance)

    Leetcode之深度优先搜索(DFS)专题-690. 员工的重要性(Employee Importance) 深度优先搜索的解题详细介绍,点击 给定一个保存员工信息的数据结构,它包含了员工唯一的id ...

  9. Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)

    Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill) 深度优先搜索的解题详细介绍,点击 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 ...

随机推荐

  1. JSP第一章动态网页的基础

    什么是动态网站(dynamic website)? 动态网站: 误区:初学者一般认为动态网页,就是会动的网页,但实际上不是这样的. 动态网页是指在服务器端运行的,使用程序语言设计的交互式网页,它们会根 ...

  2. 第二章 jQuery框架使用准备

    window常用属性: History:有关客户访问过的URL的信息 Location: 有关当前url的信息 常用方法: Confirm()将弹出一个确认对话框 open()在页面上弹出一个新的浏览 ...

  3. SpringBoot Admin 使用指南

    什么是 SpringBoot Admin? Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序.这些应用程序通过 Spring Boot Admin ...

  4. Linux EXT2 文件系统

    磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件.文件系统的目的就是组织和管理磁盘中的文件.在 Linux 系统中,最长见的是 ext2 系列的文件系统.其早期版本为 ex ...

  5. codeforces 322 A Ciel and Dancing

    题目链接 题意: 有n个男孩和m个女孩,他们要结对跳舞,每对要有一个女孩和一个男孩,而且其中一个要求之前没有和其他人结对,求出最大可以结多少对. 如图,一条线代表一对,只有这样三种情况. #inclu ...

  6. logback使用配置

    一:logback.xml配置内容如下 <?xml version="1.0" encoding="UTF-8"?> <!-- Copyrig ...

  7. 【POJ - 3258】River Hopscotch(二分)

    River Hopscotch 直接中文 Descriptions 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一块岩石跳到另一块岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点 ...

  8. Zabbix在 windows下监控网卡

    1.zabbix自定义监控Windows服务器的原理 Zabbix为Windows服务器的监控提供了PerfCounter(性能计数器)这个功能.Zabbix客户端通过PerfCounter获取Win ...

  9. JDK容器类List,Set,Queue源码解读

    List,Set,Queue都是继承Collection接口的单列集合接口.List常用的实现主要有ArrayList,LinkedList,List中的数据是有序可重复的.Set常用的实现主要是Ha ...

  10. 夯实Java基础(十)——抽象类和接口

    转载自:http://cmsblogs.com/ 该博主的网站上干货非常!非常!非常多(说三遍),强烈推荐大家前去学习. 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 抽象类与接口是 ...