「背包问题-步入」失衡天平

news2024/9/22 4:19:25

失衡天平

https://ac.nowcoder.com/acm/contest/24213/1021

题目描述

终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)

输入描述

第一行2个整数 n, m;
第二行n个整数x,分别表示n件武器的重量。
1 <= n <= 100; 0 <= m <= 100; 1 <= x <= 100;

输出描述

一个整数,表示Alice最多能拿走的武器总重量。

样例

#1

5 4
1 5 61 65 100
132

可以称两次,第1次:(1 ; 5),第二次(61 ; 65)。

#2

5 0
10 20 30 40 100
200

称一次,(10,20,30,40 ; 100)。

提示

解析

为了便于操作,造数据如下:

4 2
1 2 4 5
12

DP 信息:

  • 原问题:将一堆物品分成两堆,他们的天平差不能超过 m,求最大重量
  • 子问题:求前 i 个物品,满足天平差 j 下的最大值
  • DP 定义: d p [ i ] [ j ] dp[i][j] dp[i][j] 将前 i 个物品进行天平的摆放,天平差为 j 时的最大重量
  • DP 方程:有三种情况
    • 不放: d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − 1 ] [ j ] ) dp[i][j] = max(dp[i][j], dp[i-1][j]) dp[i][j]=max(dp[i][j],dp[i1][j])
    • 放右边: d p [ i ] [ j + W [ i ] ] = m a x ( d p [ i ] [ j + W [ i ] ] , d p [ i − 1 ] [ j ] + W [ i ] ) dp[i][j+W[i]] = max(dp[i][j+W[i]], dp[i-1][j] + W[i]) dp[i][j+W[i]]=max(dp[i][j+W[i]],dp[i1][j]+W[i])
    • 放左边: d p [ i ] [ j − W [ i ] ] = m a x ( d p [ i ] [ j − W [ i ] ] , d p [ i − 1 ] [ j ] + W [ i ] ) dp[i][j-W[i]] = max(dp[i][j-W[i]], dp[i-1][j] + W[i]) dp[i][jW[i]]=max(dp[i][jW[i]],dp[i1][j]+W[i])

1644771848107

解释DP的第二维,天平差为 j 是的最大重量:

dp[2][1] = 3 // 放入前2个物品,天平差为1时,最大值为3
那么如何体现这句话呢?
先将前2个物品进行天平摆放:
	(1)+(2) // 天平差为1,最大值为3

dp[2][2] = 2 // 放入前2个物品,天平差为2时,最大值为2
	(0)+(2) // 天平差为2,最大值为2

dp[3][1] = 7 // 放入前3个物品,天平差为1时,最大值为7
	(1+2)+(4)=7 // 天平差为1,最大值为7

dp[3][2] = dp[2][2] + 4 = 6
	dp[3][2] = max(dp[3][2], dp[2][2]);
	dp[3][2+4] = max(dp[3][2+4], dp[2][2+4] + W[3]);
	dp[3][abs(2-4)] = max(dp[3][2], dp[2][2] + W[3]); // 2+4
	// 前面dp[2][2]已经把前2个物品在天平差为2时的最大值计算好了
	// 我们现在只是新加一个物品,因此在此基础上加上当前的物品重量即可。

d p [ 3 ] [ 1 ] = 7 dp[3][1]=7 dp[3][1]=7 为例,解释如何来的:

i = 3, j = 3, W[3] = 4
不放:dp[3][3] = max(dp[3][3], dp[2][3]);
放右边:dp[3][7] = max(dp[3][7], dp[2][7] + W[3]);
放左边:dp[3][1] = max(dp[3][1], dp[2][1] + W[3]); // 3(原本是3), 3+4

AC Code

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[] W = new int[10005];
        int[][] dp = new int[105][10005];
        int sum = 0;
        
        for(int i = 1; i <= n; i++) {
            W[i] = sc.nextInt();
            sum += W[i];
        }
        
        for(int i = 0; i <= n; i++) Arrays.fill(dp[i], -0x8f);
        
        dp[0][0] = 0;
        
        for(int i = 1; i <= n; i++) {
            for(int j = 0; j <= sum; j++) {
                dp[i][j] = Math.max(dp[i][j], dp[i-1][j]);
                if(j + W[i] <= sum) dp[i][j+W[i]] = Math.max(dp[i][j+W[i]], dp[i-1][j] + W[i]);
                dp[i][Math.abs(j-W[i])] = Math.max(dp[i][Math.abs(j-W[i])], dp[i-1][j] + W[i]);
            }
        }
        
        int ans = 0;
        
        for(int i = 0; i <= m; i++) {
            ans = Math.max(ans, dp[n][i]);
        }
        
        System.out.println(ans);
    }
}

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

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

相关文章

2023-04-24 算法面试中常见的贪心算法问题

贪心算法 1 贪心选择例题 455.饼干分配 假设你想给小朋友们饼干。每个小朋友最多能够给一块儿饼干。每个小朋友都有一个“贪心指数”&#xff0c;称为g(i)&#xff0c;g(i)表示的是这名小朋友需要的饼干大小的最小值。同时&#xff0c;每个饼干都有一个大小值s(i)。如果s(j)…

转换json格式的日期为Javascript对象的函数

项目中碰到了用jQuery从后台获取的json格式的日期的字符串&#xff0c;需要将此字符串转换成JavaScript的日期对象。 代码如下: //转换json格式的日期&#xff08;如&#xff1a;{ServerDatetime:"\/Date(1278930470649)\/"}&#xff09;为Javascript的日期对象 fu…

【离散系统】传递函数和状态空间方程离散化

本文如有错误&#xff0c;恳请指正。 目录 离散系统 采样控制系统 数字控制系统 信号采样 采样定理&#xff08;香农定理&#xff09; 信号保持—零阶保持器 Z变换 Z 变换方法 级数求和法 部分分式法 基本定理 Z反变换 Z反变换方法 长除法 部分分式法&#xff0…

hook函数,toRef家族

自定义hook函数 什么是hook?——本质是一个函数&#xff0c;把setup函数中使用的组合式API 进行了封装。 类似于vue2.x中的mixin。 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂。 定义钩子&#xff1a; 使用钩子 toRef&#xff0c;toRefs 作用:创建一个ref对象…

WinScope实现录制视频与是Timeline时间轴同步设置方法-千里马framework车载手机系统开发实战

hi&#xff0c;粉丝朋友们&#xff01; 背景&#xff1a; 今天来分享一个粉丝朋友提出的问题&#xff0c;那就是他在学习wms课程时候有用到winscope工具&#xff0c;提出一个疑问&#xff0c;就是google官网说的有录屏可以结合起来一起看。具体如下&#xff1a; 其实这个以…

Vue 手搓轮播效果

tiptop: 为啥需要写这个功能&#xff0c;因为我遇到了每个轮播层内要放3个左右的商品块&#xff0c;如果使用element自带的轮播就需要将一维数组切成二维数组&#xff0c;导致处理一些情况下就会变得很麻烦&#xff0c;当然那种我也写了如果你们有需要&#xff0c;在下方留言我…

柳永8首绝美词句

他是白衣卿相&#xff0c;是才子词人。 他有傲人的才华&#xff0c;却仕途失意。 他眠花宿柳&#xff0c;写下流传千古的词章。 他是才子柳永。 今天&#xff0c;给大家介绍他的8首词&#xff0c;体会柳永的人生起伏。 1、《雨霖铃 寒蝉凄切》 寒蝉凄切&#xff0c;对长亭晚…

Kafka 安装部署-单节点

Kafka强依赖ZK&#xff0c;如果想要使用Kafka&#xff0c;就必须安装ZK&#xff0c;Kafka中的消费偏置信息、kafka集群、topic信息会被存储在ZK中。有人可能会说我在使用Kafka的时候就没有安装ZK&#xff0c;那是因为Kafka内置了一个ZK&#xff0c;一般我们不使用它。 部署说明…

Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程

本文转载自&#xff1a;https://forums.100ask.net/t/topic/3027 移植 QT5 教程 &#xff08;此教程基于docker版V851S开发环境&#xff09; docker pull registry.cn-hangzhou.aliyuncs.com/gloomyghost/yuzukilizard 编译依赖 apt-get install repo git gcc-arm-linux-gn…

用户订阅付费如何拆解分析?看这篇就够了

会员制的订阅付费在影音娱乐行业中已相当普及&#xff0c;近几年&#xff0c;不少游戏厂商也开始尝试订阅收费模式。在分析具体的用户订阅偏好以及订阅付费模式带来的增长效果时&#xff0c;我们常常会有这些疑问&#xff1a; 如何从用户的整体付费行为中具体拆解订阅付费事件…

Numpy从入门到精通——数组变形|合并数组

这个专栏名为《Numpy从入门到精通》&#xff0c;顾名思义&#xff0c;是记录自己学习numpy的学习过程&#xff0c;也方便自己之后复盘&#xff01;为深度学习的进一步学习奠定基础&#xff01;希望能给大家带来帮助&#xff0c;爱睡觉的咋祝您生活愉快&#xff01; 这一篇介绍《…

SLAM论文速递:SLAM—— 流融合:基于光流的动态稠密RGB-D SLAM—4.25(2)

论文信息 题目&#xff1a; FlowFusion:Dynamic Dense RGB-D SLAM Based on Optical Flow 流融合:基于光流的动态稠密RGB-D SLAM论文地址&#xff1a; https://arxiv.org/pdf/2003.05102.pdf发表期刊&#xff1a; 2020 IEEE International Conference on Robotics and Automa…

【Spring Cloud】Spring Cloud 是什么?

文章目录 前言一、子项目二、常用组件三、把 Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格&#xff1a; 前言 Spring 以 Bean&#xff08;对象&#xff09; 为中心&#xff0c;提供 IOC、AOP 等功能。Spring Boot 以 Application&#xff08;应用&#xff09; 为中…

Python小姿势 - Python操作Excel表格数据

Python操作Excel表格数据 在日常工作中&#xff0c;我们经常会遇到一些需要对表格数据进行处理的情况&#xff0c;比如&#xff1a;数据清洗、数据分析、数据可视化等。对于这些任务&#xff0c;我们可以使用Python来进行操作。 在Python中操作Excel表格数据&#xff0c;我们可…

electron+vue3全家桶+vite项目搭建【13】封装加载进度显示,新建窗口 演示主进程与渲染进程通信

文章目录 引入实现效果演示&#xff1a;1.封装新建窗口工具2.测试新建窗口3.封装进度条加载4.测试进度条加载 引入 这里我们通过封装electron的工具类来演示electron中的主进程和渲染进程利用ipc进行通信 demo项目地址 electron官方文档ipc通信 实现效果演示&#xff1a; …

通过注册表设置远程桌面的配置

***************************修改远程终端端口号*************************** [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp] "PortNumber"dword:00000d3d [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Ser…

代码优雅之道——如何干掉过多的if else

1、前言 注意标题是过多的&#xff0c;所以三四个就没必要干掉了。实际开发中我们经常遇到判断条件很多的情况&#xff0c;比如下图有20多种情况&#xff0c;不用想肯定是要优化代码的&#xff0c;需要思考的是如何去优化&#xff1f; 网上很多说用switch case啊&#xff0c;首…

算法刷题|198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

打家劫舍 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定…

【社区图书馆】Fundamentals Of Computer Graphics——The beginning of computer graphics

目录 English 中文 English "Fundamentals Of Computer Graphics" is a classic textbook on computer graphics, also known as the "Tiger Book". It is considered one of the best introductory texts in the field of computer graphics. The book …

1分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…