题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法

  • 原题链接:
  • 完成情况:
  • 解题思路:
      • Problem Explanation
      • Code Explanation
      • Summary
  • 参考代码:
    • _题目2721_蓝桥杯2022年第十三届决赛真题_背包与魔法
  • 错误经验吸取

原题链接:

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法

https://www.dotcpp.com/oj/problem2721.html

完成情况:

在这里插入图片描述

解题思路:

The provided code solves a variant of the 0/1 knapsack problem with an additional magical transformation capability for one item. Here’s a detailed breakdown of the code and its workings:

Problem Explanation

You are given ( N ) items, each with a weight ( W_i ) and value ( V_i ). You also have a knapsack that can carry up to ( M ) weight. The goal is to maximize the total value of the items in the knapsack. Additionally, you can apply a magic transformation to one item which increases its weight by ( K ) and doubles its value.

Code Explanation

  1. Input Parsing:

    Scanner scanner = new Scanner(System.in);
    N = scanner.nextInt();
    M = scanner.nextInt();
    K = scanner.nextInt();
    weights = new int[N + 1];
    values = new int[N + 1];
    dp_bagAndMagic = new int[M + K + 1][2];
    for (int i = 1; i <= N; i++) {weights[i] = scanner.nextInt();values[i] = scanner.nextInt();
    }
    
    • N: Number of items.
    • M: Maximum weight the knapsack can carry.
    • K: Additional weight added when magic is used.
    • Arrays weights and values store the weights and values of the items, respectively, starting from index 1.
    • dp_bagAndMagic is a 2D array where:
      • dp_bagAndMagic[j][0] represents the maximum value achievable with weight j without using magic.
      • dp_bagAndMagic[j][1] represents the maximum value achievable with weight j using magic on one item.
  2. Dynamic Programming Table Update:

    for (int i = 1; i <= N; i++) { // Iterate over itemsfor (int j = M; j >= weights[i]; j--) { // Iterate over possible weights from M down to the weight of the itemif (j >= weights[i] + K) { // If the current weight allows the use of magicdp_bagAndMagic[j][0] = Math.max(dp_bagAndMagic[j][0], dp_bagAndMagic[j - weights[i]][0] + values[i]);dp_bagAndMagic[j][1] = Math.max(dp_bagAndMagic[j][1], Math.max(dp_bagAndMagic[j - weights[i] - K][0] + 2 * values[i], dp_bagAndMagic[j - weights[i]][1] + values[i]));} else {dp_bagAndMagic[j][0] = Math.max(dp_bagAndMagic[j][0], dp_bagAndMagic[j - weights[i]][0] + values[i]);}}
    }
    
    • The outer loop iterates over each item.
    • The inner loop iterates over possible weights in reverse to avoid overwriting values prematurely.
    • If the weight j can accommodate the item with the magic transformation (j >= weights[i] + K), the code updates both dp_bagAndMagic[j][0] and dp_bagAndMagic[j][1].
      • dp_bagAndMagic[j][0] is updated considering the item without magic.
      • dp_bagAndMagic[j][1] is updated considering both using magic on the current item and the best possible value without magic.
    • If the weight j cannot accommodate the magic transformation, only dp_bagAndMagic[j][0] is updated.
  3. Determine Maximum Value:

    int sum = 0;
    for (int i = 0; i <= M; i++) {sum = Math.max(sum, Math.max(dp_bagAndMagic[i][1], dp_bagAndMagic[i][0]));
    }
    System.out.println(sum);
    
    • Iterate over all possible weights up to M to find the maximum value obtainable.
    • sum keeps track of the highest value found between using and not using magic.

Summary

  • The code effectively handles the additional complexity introduced by the magical transformation by maintaining a dual-state DP table.
  • It ensures the maximum possible value is calculated by considering both the scenarios of using and not using the magic for each weight and item.
  • The final maximum value is derived by iterating over all possible weights, considering both states (with and without magic).

This approach ensures an optimal solution to the given problem using dynamic programming.

参考代码:

_题目2721_蓝桥杯2022年第十三届决赛真题_背包与魔法

package leetcode板块;import java.util.Scanner;public class _题目2721_蓝桥杯2022年第十三届决赛真题_背包与魔法 {private static int N,M,K;private static int weights [],values[];private static int dp_bagAndMagic [][];/**** @param args*/public static void main(String[] args) {//  N件物品,第i件重量为W_i , 价值为 V_i ,最大承重是 M//  求最大价值//  小蓝还有【一个】模型,可以 让某个物品 重量+K,,价值变成   V_i *  V_iScanner scanner = new Scanner(System.in);N = scanner.nextInt();M = scanner.nextInt();K = scanner.nextInt();// 数组额外加一个0号单元格,用于表示没选取物品,及其价值情况weights = new int[N+1];values = new int[N+1];dp_bagAndMagic = new int[M+K+1][2];for (int i = 1;i<=N;i++){weights[i] = scanner.nextInt();values[i] = scanner.nextInt();}// ----------   TODO  dp迭代for (int i = 1;i<=N;i++){   // 物品件for (int j = M;j>=weights[i];j--){  //重量if (j>=weights[i] + K){     // 如果当前商品重量可以使用魔法// 进行考量dp_bagAndMagic[j][0] = Math.max(dp_bagAndMagic[j][0],dp_bagAndMagic[j-weights[i]][0] +values[i]);dp_bagAndMagic[j][1] = Math.max(dp_bagAndMagic[j][1],Math.max(dp_bagAndMagic[j-weights[i]-K][0] + 2*values[i],dp_bagAndMagic[j-weights[i]][1]+values[i]));}else{dp_bagAndMagic[j][0] = Math.max(dp_bagAndMagic[j][0],dp_bagAndMagic[j-weights[i]][0] + values[i]);}}}int sum = 0;for (int i = 0;i<=M;i++){sum = Math.max(sum,Math.max(dp_bagAndMagic[i][1],dp_bagAndMagic[i][0]));}System.out.println(sum);}
}

错误经验吸取

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

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

相关文章

Hexo结合多个主题扩展为Gallery画廊并实现文章加密

文章目录 1. 初始化2. 安装加密3. 配置文件4. 创建Token5. 新建公开仓库6. 工作流7. 实现效果1. 加密2. 画廊B主题 可能参考的文章&#xff1a; 如何优雅的使用Github Action服务来将Hexo部署到Github Pages - Hexo 当前PC环境中有Node和Git。版本可以参考Hexo文档。 文章中…

ubuntu的不同python版本的pip安装及管理

ubuntu的不同python版本的pip安装及管理_ubuntu 安装两个pip-CSDN博客https://blog.csdn.net/qq_32277533/article/details/106770850

第10章 启动过程组 (识别干系人)

第10章 启动过程组 10.2识别干系人&#xff0c;在第三版教材第361~362页&#xff1b; 文字图片音频方式 视频13 第一个知识点&#xff1a;主要工具与技术 1、数据收集 问卷调查 包括一对一调查、焦点小组讨论&#xff0c;或其他大规模信息收集技术 头脑风暴 头脑风暴&#xff…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4162(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、SPI配置: 2)、时钟配置: 四、软件部分: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

MinIO下载和安装(Windows)

1、MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 2、在本地硬盘中并新建一个minio文件夹 里面再创建bin文件夹和data文件夹 bin 用于存放下载的minio.exe data 用于存放数据 logs 用于存放日志 3、 编写启动脚本start.bat echo off echo [信息] 运行MinIO文服务…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

鸿蒙开发系统基础能力:【@ohos.hiTraceMeter (性能打点)】

性能打点 本模块提供了追踪进程轨迹&#xff0c;度量程序执行性能的打点能力。本模块打点的数据供hiTraceMeter工具分析使用。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impor…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

记录一个Xshell使用中Xmanager...X11转发的提示问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得有帮助的话&#xff0c;点赞关注收藏支持一下博主哦&#xff5e; 阅读指南 一、环境说明1.1 硬件环境1.2 软件环境 二、问题和错误三、解决四、理解和延伸一下 一、环境说明 考虑环境因素&#xff0c;大家适当的对比自己的软硬…

黑马程序员——Spring框架——day08——maven高级

目录&#xff1a; 分模块开发与设计 分模块开发的意义 问题导入模块拆分原则分模块开发&#xff08;模块拆分&#xff09; 问题导入创建Maven模块书写模块代码通过maven指令安装模块到本地仓库&#xff08;install指令&#xff09;依赖管理 依赖传递 问题导入可选依赖 问题导入…

数据结构与算法—空间复杂度详解与示例(C#,C++)

文章目录 1. 数据结构概述2. 空间复杂度的定义及影响因素3. 空间复杂度的区分常数空间复杂度&#xff08;O(1)&#xff09;线性空间复杂度&#xff08;O(n)&#xff09;其他空间复杂度 4. 几种典型数据结构的优缺点分析数组&#xff08;Array&#xff09;链表&#xff08;Linke…

10 种最佳编程字体

1.Commit Mono 这是我目前最喜欢的字体。这是我用来输入这篇文章的字体。作者 Eigil Nikolajsen 于 2023 年使用Fira Code和JetBrains Mono作为灵感开发了它。 Commit Mono 清晰易读&#xff0c;可配置性强。您可以根据粗细&#xff08;我更喜欢最细的 300&#xff09;、连字、…

联发科MT6775(Helio P70)_MTK6775处理器规格参数_处理器资料

联发科MT6775(Helio P70)采用了台积电12nm工艺制程八核处理器&#xff0c;由4颗 Arm Cortex-A73 2.1GHz 4颗Arm Cortex-A53 2.0GHz组成。其GPU为ARM Mali-G72 MP3&#xff0c;运行时高达900MHz&#xff0c;比上一代Helio P60效能提升了13%。 值得注意的是&#xff0c;联发科MT…

Charles抓包工具系列文章(四)-- Rewrite 重写工具

一、背景 这是一款比Map Local/Remote 还强大的工具&#xff0c;更加灵活&#xff0c;体现在以下几点&#xff1a; 重写request报文重写response报文header 字段的增删改query param 字段的增删改重写 body 字段改写http 响应状态status重写host/url/path 从这也可以看出其强…

R语言——数据与运算

练习基本运算&#xff1a; v <- c(2,4,6,9)t <- c(1,4,7,9)print(v>t)print(v < t)print(v t)print(v!t)print(v>t)print(v<t) v <- c(3,1,TRUE,23i)t <- c(4,1,FALSE,23i)print(v&t)print(v|t)print(!v)v <- c(3,0,TRUE,22i)t <- c(1,3,T…

ITIL发展之路:从v3到v4的演变与应用

在当今瞬息万变的技术环境中&#xff0c;IT服务管理&#xff08;ITSM&#xff09;已成为企业运营的关键支柱。ITIL&#xff08;Information Technology Infrastructure Library&#xff0c;信息技术基础设施库&#xff09;作为全球公认的ITSM最佳实践框架&#xff0c;帮助组织在…

【linux基础awk】如何基于强大的awk打印列、计算

打印列 awk {print $1} test.txt#-F参数去指定分隔的字符 awk -F "," {print $1,$2} file 匹配打印列 awk /a/ {print $4 "\t" $3} test.txt筛选数值 仅打印那些含有多于18个字符的行。awk length($0) > 18 test.txt 统计数目 #统计行数 less num…

高考填报志愿,找准自己的真兴趣来选择专业

又是一年一度的高考填报志愿的时间了&#xff0c;毕业生们要根据自己的分数&#xff0c;在很短的时间内确定自己的专业。专业千万条&#xff0c;兴趣第一条。专业的选择很大程度上决定着大学的学习生活是否顺利&#xff0c;甚至决定着以后的职业生涯。在纷繁复杂的专业中&#…