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;
}
}
- 本地密码检索工具 – LaZagne Project
- 我是如何在SQLServer中处理每天四亿三千万记录的
- 程序猿是如何解决SQLServer占CPU100%的
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
- 分享一个自制的 .net线程池1
- 分享一个自制的 .net线程池2
- 基于百度翻译的简单爬虫翻译-- coding:utf-8 --访问网址模拟浏览器创建文件夹用一个text文件保存,文件名用单词名字
- .net采集网页方法大全(5种)
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
- 中文分词之结巴分词~~~附使用场景+demo(net)
- 用微信二维码登录自己的网站
- 2620: [Usaco2012 Mar]Haybale Restacking
- 1671: [Usaco2005 Dec]Knights of Ni 骑士
- 1592: [Usaco2008 Feb]Making the Grade 路面修整
- 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 数组属性和方法
- 第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进
- SpringBoot——全局异常捕获和自定义异常
- RTSP协议视频平台EasyNVR接入到EasyNVS管理平台后无法显示RTMP及RTSP视频流地址问题
- SpringBoot——配置logback日志
- Istio 运维实战系列(2):让人头大的『无头服务』-上
- 第十节:Activiti6.0——四种Job工作的产生与管理
- 使用vue3.0,不需要build也可以
- 听说vue项目不用build也能用?
- 使用 Vue 3.0,你可能不再需要Vuex了
- MySQL InnoDB索引:存储结构
- Element 根据描述展示表单
- VUE 插件注册
- 表格中的输入框验证
- 不可忽视的CSS布局
- 让小黑窗口听你指挥