638. 大礼包 Krains 2020-08-01 19:48:29 动态规划DFS
时间:2022-07-22
本文章向大家介绍638. 大礼包 Krains 2020-08-01 19:48:29 动态规划DFS,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
# 题目链接
# DFS加记忆化
解题思路
- 将原价物品打包成大礼包,统一进行处理
- 如果最优解中包含一种大礼包,那么该大礼包一定是买到不能买为止的。
- 使用DFS搜索所有可能购买的方案,对于相同的needs来说最优解是一定的,所以可以加记忆化。
class Solution {
Map<List<Integer>, Integer> memo = new HashMap<>();
public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {
// 将原价物品也打包成大礼包,方便处理
for(int i = 0; i < price.size(); i++){
List<Integer> list = new ArrayList<>();
for(int j = 0; j < price.size(); j++){
if(j != i)
list.add(0);
else
list.add(1);
}
list.add(price.get(i));
special.add(list);
}
// 将needs全为0状态放入
List<Integer> list = new ArrayList<>();
for(int i = 0; i < needs.size(); i++)
list.add(0);
memo.put(list, 0);
return helper(special, needs);
}
public int helper(List<List<Integer>> special, List<Integer> needs) {
if(memo.containsKey(needs))
return memo.get(needs);
int i;
int cost = (int)1e8;
for(List<Integer> list : special){
// k为最多购买k件当前大礼包
int k = (int)1e8;
for(i = 0; i < list.size()-1; i++){
if(list.get(i) != 0){
k = Math.min(k, needs.get(i) / list.get(i));
}
}
// 如果当前礼包无法购买,考虑下一个礼包
if(k == 0)
continue;
// 购买k件当前大礼包
List<Integer> temp = new ArrayList<>();
for(i = 0; i < list.size() - 1; i++)
temp.add(needs.get(i) - k * list.get(i));
cost = Math.min(cost, helper(special, temp) + k * list.get(i));
}
// 记忆
memo.put(needs, cost);
return cost;
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 其他流---对象处理流
- 打印流
- 文件分割与合并
- 其他流---基本数据处理流
- 其他流---字节数组流与文件流对接
- 其他流---字节流数组
- 字符流出现乱码问题
- 缓冲流---为字节流和字符流复制文件增加缓冲流
- 字符流---输入输出与复制文本文件
- Spring 中的几个 PostProcessor 的区别与联系
- Spring 中基于注解的事务控制及原理分析
- Spring 中根据环境切换配置 @Profile
- Spring 中的属性赋值
- Spring 中控制 Bean 生命周期的几种方式及 BeanPostProcessor 执行原理
- Spring 中的 @Import 注解及向容器中添加 Bean 的几种方式