牛客:HJ16 购物单【01背包】【华为机考】

学习要点

  1. 深入理解回溯
  2. 深入理解01背包问题

题目链接

        购物单_牛客题霸_牛客网

题目描述

解法1:回溯

        其实此题非常符合取子集的逻辑,但是时间复杂度太高。通过11/14。想写出来这个回溯过程,不容易。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int money; // 有多少钱
int max_value = 0; // 礼物最终的最大价值
bool check[66];void dfs(vector<vector<int>>& v_big, int pos, int path_value, int path_cost) {for (int i = pos; i <= v_big.size() - 1; i++) {// 主件不附带他人,但是有可能已经被别的附带// 没有被添加过的主件if (v_big[i][3] == 0 && check[i] == false) {// 还可以买这个主件if ((path_cost + v_big[i][1]) <= money) {check[i] = true;max_value = max(max_value, path_value + v_big[i][1] * v_big[i][2]);if ( i == v_big.size()) {check[i] = false;break;}dfs(v_big, i + 1, path_value + v_big[i][1] * v_big[i][2],path_cost + v_big[i][1]);check[i] = false;}// 钱不够了,不能买这个主件else {max_value = max(max_value, path_value);// if (i != v_big.size() - 1) {//     continue;// }}}// 已经被添加过的主件else if (v_big[i][3] == 0 && check[i] == true) {// if (i != v_big.size() - 1) {//     continue;// }}// 附件附带的主件有可能被添加过,有可能没有被添加过// 已经添加主件的附件else if (v_big[i][3] != 0 && check[v_big[i][3]] == true) {// 还可以买这个附件if ((path_cost + v_big[i][1]) <= money) {check[i] = true;max_value = max(max_value, path_value + v_big[i][1] * v_big[i][2]);if ( i == v_big.size()) {check[i] = false;break;}dfs(v_big, i + 1, path_value + v_big[i][1] * v_big[i][2],path_cost + v_big[i][1]);check[i] = false;}// 钱不够了,不能买这个附件else {max_value = max(max_value, path_value);// if (i != v_big.size() - 1) {//     continue;// }}}// 没有添加主件的附件else if (v_big[i][3] != 0 && check[v_big[i][3]] == false) {// 还可以买这个附件if ((path_cost + v_big[i][1] + v_big[v_big[i][3]][1] ) <= money) {check[i] = true;check[v_big[i][3]] = true;max_value = max(max_value, path_value + v_big[i][1] * v_big[i][2]);if ( i == v_big.size()) {check[i] = false;break;}dfs(v_big, i + 1, path_value + v_big[i][1] * v_big[i][2] +v_big[v_big[i][3]][1] * v_big[v_big[i][3]][2],path_cost + v_big[i][1] + v_big[v_big[i][3]][1]);check[i] = false;check[v_big[i][3]] = false;}// 钱不够了,不能买这个附件{max_value = max(max_value, path_value);// if (i != v_big.size() - 1) {//     continue;// }}}else {}}
}int main() {int count;cin >> money >> count;// cout << money << " " << count << endl;vector<vector<int>> v_big(count + 1, vector<int>(4));int i = 1;while (i <= count) {cin >> v_big[i][1] >> v_big[i][2] >> v_big[i][3];i++;}// for(int j = 1; j<= count; j++)// {//     cout << v_big[j][1] << " "<< v_big[j][2] << " " << v_big[j][3] << endl;// }dfs(v_big, 1, 0, 0);cout << max_value << endl;return 0;
}

解法2:01背包

#include <bits/stdc++.h>
using namespace std;int main() {int count;int money;cin >> money >> count;// cout << money << " " << count << endl;vector<vector<int>> v_big(count + 1, vector<int>(4));int i = 1;while (i <= count) {cin >> v_big[i][1] >> v_big[i][2] >> v_big[i][3];i++;}// 简单改造一下这个数组for(int i = 1; i<=count;i++){v_big[i][1] = v_big[i][1] / 10;v_big[i][2] = v_big[i][2] * 10;if(v_big[i][3] != 0 ){int index = v_big[i][3];v_big[index].push_back(v_big[i][1]); v_big[index].push_back(v_big[i][2]);v_big[i][1] = 0; v_big[i][2] = 0; v_big[i][3] = 0;}}// 动归逻辑int num = money / 10;vector<vector<int>> dp(count + 1,vector<int>(num+1,0));// 首元素情况:无附件主件、单附件主件、双附件主件// 恰巧我们v_big[0]是全0,我们索性将其虚拟成0号物品这样方便我们进行初始化// 则全部初始化为0即可for(int i = 1; i<=count;i++){for(int j = 1; j<=num; j++){if(v_big[i][1] > j){dp[i][j] = dp[i-1][j];}else{// 不取该主件   int a = dp[i-1][j];// 只取该主件int b = dp[i-1][j - v_big[i][1]] + v_big[i][1] * v_big[i][2];// 取主件取单附件int c1 = 0;int c2 = 0;int c = 0;if(v_big[i].size() > 4){if((v_big[i][1] + v_big[i][4]) <= j){c1 = dp[i-1][j-v_big[i][1] - v_big[i][4]] + v_big[i][1] * v_big[i][2] + v_big[i][4] * v_big[i][5];}if((v_big[i][1] + v_big[i][6]) <= j){c2 = dp[i-1][j-v_big[i][1] - v_big[i][6]] + v_big[i][1] * v_big[i][2] + v_big[i][6] * v_big[i][7];}c = max(c1,c2);}// 取主件取双附件int d = 0;if(v_big[i].size() > 6){if((v_big[i][1] + v_big[i][4] + v_big[i][6]) <= j){d = dp[i-1][j-v_big[i][1] - v_big[i][4]- v_big[i][6]] + v_big[i][1] * v_big[i][2] + v_big[i][4] * v_big[i][5] + v_big[i][6] * v_big[i][7];}}int max1 = max(a,b); int max2 = max(c,d); int max3 = max(max1,max2);dp[i][j] = max3;}}}cout << dp[count][num]  << endl;return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87484.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[学习记录]Unity毛发渲染[URP]-Fin基础版

鳍片法是一种在多边形表面垂直添加许多多边形&#xff0c;并在其上粘贴毛发纹理以营造毛茸茸的感觉的技术。这就像种植许多鳍&#xff08;就像鱼身上的鳍一样&#xff09;。本期我将在Unity6中实现一下基础的Fin毛发&#xff0c;并不涉及光照着色。后面我会出一篇加上着色效果的…

指针篇(7)- 指针运算笔试题(阿里巴巴)

目录 一、指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目2&#xff1a;3.3 指针3&#xff1a;3.4 题目4&#xff1a;3.5 题目5&#xff1a;3.6 题目6&#xff1a;3.7 题目7&#xff1a; 总结 一、指针运算笔试题解析 3.1 题目1&#xff1a; #include<stdio.h> int m…

homebrew的一些常用方法

前言 因本人工作换到mac电脑&#xff0c;对包管理器homebrew的需求增加&#xff0c;因此将一些常用命令做如下记录&#xff0c;本博客主要用作记录用。 官网 macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew 常用命令 如果脚本因网络问题无法下载…

【Python面试题】Python面试之基础知识常见面试题3-汇总篇(精选30个)

目录专栏导读前言1. 字典的内存管理机制是什么&#xff1f;2. 列表的内存管理机制是什么&#xff1f;3. 元组和列表的区别4. 字符串插值的方法5. 闭包、装饰器的原理闭包&#xff08;Closure&#xff09;装饰器&#xff08;Decorator&#xff09;6. map、filter的区别7. range(…

【免费.NET方案】CSV到PDF与DataTable的快速转换

CSV作为轻量级数据载体&#xff0c;在数据传输中占比超过70%。但其原生格式存在三大痛点&#xff1a; 可视化缺陷&#xff1a;无法直接生成可打印的报表结构限制&#xff1a;缺乏数据类型定义和关系约束安全风险&#xff1a;易被意外修改导致数据失真 因此&#xff0c;我们常…

connect的断线重连

connect的短线重连 客户端代码的编写服务器代码的编写总结 客户端代码的编写 #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h>…

通过观看数百个外科手术视频讲座来学习多模态表征|文献速递-最新论文分享

Title题目Learning multi-modal representations by watching hundreds of surgical video lectures通过观看数百个外科手术视频讲座来学习多模态表征01文献速递介绍外科计算机视觉领域的最新进展&#xff0c;已开始为手术室&#xff08;OR&#xff09;的新一代人工智能辅助支…

微信小程序如何实现再多个页面共享数据

在微信小程序中&#xff0c;实现多个页面共享数据有以下几种常用方式&#xff0c;根据场景选择最适合的方案&#xff1a; 全局变量&#xff08;App.js&#xff09; 适用场景&#xff1a;简单数据共享&#xff08;非响应式&#xff09; 实现方式&#xff1a; javascript // ap…

PCIE5.0 TAG说明(ima回答)

在PCIe 5.0规范中&#xff0c;TLP&#xff08;Transaction Layer Packet&#xff09;报文的Tag字段用于标识和管理事务。以下是关于Tag的生成和使用规则和定义的详细描述&#xff1a; Tag字段的定义 Tag字段&#xff1a;位于TLP报文的Header中&#xff0c;占用8位&#xff08…

Type-C PD快充协议智能芯片S312L详解

1. 芯片概述 S312L 是一款智能Type-C PD协议触发芯片&#xff0c;支持**PD3.0&#xff08;含PPS&#xff09;**及多种A口快充协议&#xff08;如QC/PE等&#xff09;&#xff0c;可自动识别并申请5V/9V/12V电压&#xff0c;适用于快充适配器、移动电源等场景。 核心优势&…

stm32学到什么程度可以找工作?

我重新为你写一篇更加详细深入的回答&#xff1a; STM32学到什么程度可以找工作&#xff1f;一个十年老兵的血泪史 写在前面的话&#xff1a;这些年踩过的坑&#xff0c;都是血淋淋的教训 刚看到这个问题&#xff0c;我就想起了2014年那个炎热的夏天。 当时我刚从厦门某马离…

基于 Elasticsearch 实现地图点聚合

在地图类应用中&#xff0c;当需要展示大量地理兴趣点时&#xff0c;直接将所有点渲染在地图上会导致视觉混乱&#xff0c;影响用户体验。为此&#xff0c;我基于 Elasticsearch 提供的 geotile_grid 和 geo_bounding_box 查询能力&#xff0c;实现了一套高效的 POI 聚合展示方…

【Prometheus 】通过 Pushgateway 上报指标数据

Prometheus 是目前最流行的开源监控系统之一&#xff0c;其拉取&#xff08;pull&#xff09;模型非常适合服务发现和静态目标的监控。然而&#xff0c;在某些场景下&#xff0c;例如短生命周期任务、批处理作业或无法暴露 HTTP 接口的服务&#xff0c;传统的拉取方式并不适用。…

服务器 - - QPS与TPS介绍

1、QPS&#xff08;Queries Per Second 每秒查询数&#xff09; 定义&#xff1a;常用于表示每秒的请求次数&#xff0c;衡量接口请求、数据库查询等动作的吞吐量&#xff08;单位时间内处理的数据量&#xff09; 计算&#xff1a;总请求数/请求时间&#xff0c;如&#xff1…

Cot2:思维链提示激发大型语言模型的推理能力

摘要 我们探讨了生成思维链——一系列中间推理步骤——如何显著提升大型语言模型执行复杂推理的能力。特别地&#xff0c;我们展示了在足够大的语言模型中&#xff0c;这种推理能力如何通过一种简单的方法——思维链提示&#xff08;chain-of-thought prompting&#xff09;自…

go交易数据后端

地址 https://gitee.com/EEPPEE_admin/go-stock-line-trading-datahttps://github.com/jerryshell/midas 需求 为了替代rust后端爬虫端: 爬取东方财富数据到index-data目录server端: 项目主要内容 todo 替代https://github.com/jerryshell/midas的前端量化概念性理解扩展: 存储…

灵巧手概览

第一章 灵巧手的技术演进与核心价值 1.1 技术演进的五个阶段 仿生学启蒙阶段&#xff08;1960-1980&#xff09; 1968年斯坦福大学首台3自由度机械夹爪标志机器人操作技术开端&#xff0c;1973年MIT提出"仿生手"概念&#xff0c;但受限于材料和控制技术&#xff0c;…

在设计提示词(Prompt)时,关于信息位置的安排z怎么 结合模型特性和任务目标

在设计提示词(Prompt)时,关于信息位置的安排z怎么 结合模型特性和任务目标 在设计提示词(Prompt)时,关于信息位置的安排确实需要结合模型特性和任务目标。从自注意力机制的原理及应用场景来看,关键信息的位置选择需遵循以下启示,并结合具体场景灵活调整: 一、核心启示…

七、性能优化

目录 1. 如何检测Flutter应用的性能问题&#xff1f;2. 什么是重绘边界&#xff08;Repaint Boundary&#xff09;&#xff1f;3. 如何避免不必要的重建&#xff1f;4. const 构造函数在优化中起什么作用&#xff1f;5. 如何优化长列表的性能&#xff1f;6. 如何减少应用启动时…

Webpack优化详解

Webpack 5提供了一系列工具和功能,可以在本地开发和线上构建过程中进行优化,以提高开发效率和构建性能。 1. 本地开发优化 1.1. 开启模块热替换(HMR) 模块热替换可以在不刷新整个页面的情况下更新模块,提高开发效率。 const webpack = require(webpack);module.export…