当前位置:网站首页>leetcode刷题:动态规划09(最后一块石头的重量 II)
leetcode刷题:动态规划09(最后一块石头的重量 II)
2022-07-28 03:29:00 【涛涛英语学不进去】
1049. 最后一块石头的重量 II
题目难度:中等
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。
示例:
输入:[2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
提示:
- 1 <= stones.length <= 30
- 1 <= stones[i] <= 1000
dp[j]为 容量为 j 的背包
则每次如果取石头 stones[i] 则dp[j]的剩余容量为Math.max(dp[j],dp[j-stones[i]]+stone[i]),
如果不取这个石头,则不变
/**
* 把石头总重量均分为两堆,最后一相减,就得到最后是否还有剩余石头
* 即:找到容量为一半时可以装入的石头,和剩余石头容量比较,就可以得到所求剩余石头重量
* 1. dp[j]:容量为j的背包可以装下的最大石头数量。j取石头总数的一半,dp[j]<=j
* 因为到时候需要与剩下的石头重量相减
* 2. 确定递推公式 stones是背包已经装的石头数量,dp[j-stones[i]]求背包剩下容量还可以装的石头
* 3.dp数组初始化:dp[j]每次取最大值,所以取0就可以,dp[j]才不会初始值覆盖,石头重量肯定>0
* 4.确定遍历顺序:先遍历石头个数,再重后往前遍历背包(从前往后会导致已经得到的dp[i]被重复使用)
*/
package com.programmercarl.dynamic;
/** * @ClassName LastStoneWeightII * @Descriotion TODO * @Author nitaotao * @Date 2022/7/27 15:55 * @Version 1.0 * https://leetcode.cn/problems/last-stone-weight-ii/ * 1049. 最后一块石头的重量 II **/
public class LastStoneWeightII {
public int lastStoneWeightII(int[] stones) {
/** * 把石头总重量均分为两堆,最后一相减,就得到最后是否还有剩余石头 * 即:找到容量为一半时可以装入的石头,和剩余石头容量比较,就可以得到所求剩余石头重量 * 1. dp[j]:容量为j的背包可以装下的最大石头数量。j取石头总数的一半,dp[j]<=j * 因为到时候需要与剩下的石头重量相减 * 2. 确定递推公式 stones是背包已经装的石头数量,dp[j-stones[i]]求背包剩下容量还可以装的石头 * 3.dp数组初始化:dp[j]每次取最大值,所以取0就可以,dp[j]才不会初始值覆盖,石头重量肯定>0 * 4.确定遍历顺序:先遍历石头个数,再重后往前遍历背包(从前往后会导致已经得到的dp[i]被重复使用) */
//总石头重量和
int sum = 0;
for (int i = 0; i < stones.length; i++) {
sum += stones[i];
}
// / 向下取整 sum/2>=target
int target = sum / 2;
//dp[j]:容量为j的背包可以装下的最大石头数量。j取石头总数的一半,dp[j]<=j
// j 容量 dp[j] 容量为j的背包
int[] dp = new int[target + 1];
//先遍历石头
for (int i = 0; i < stones.length; i++) {
//从后往前遍历的
//j 初始值为背包总容量
for (int j = target; stones[i] <= j; j--) {
//stones[i]<=j 石头体积<=背包容量
// 放 当前j-store[i] 容量的背包 装 stones[i]
dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
//减去两个相同大小的石堆
return sum - dp[target] * 2;
}
public static void main(String[] args) {
System.out.println(new LastStoneWeightII().lastStoneWeightII(new int[]{
2, 7, 4, 1, 8, 1}));
}
}

代码随想录刷题停更了,xmd,我刷不动了,要去好好听课练练了55555555555
边栏推荐
- Malloc, free, calloc, realloc dynamic memory development functions in dynamic memory management
- 2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数。
- xctf攻防世界 Web高手进阶区 PHP2
- Embedded database -- SQLite
- SAP UI5 FileUploader 控件深入介绍 - 为什么需要一个隐藏的 iframe 试读版
- Illustrated: detailed explanation of JVM memory layout
- xctf攻防世界 Web高手进阶区 unserialize3
- Play WolframAlpha computing knowledge engine
- Container related concepts
- [R language] environment specifies to delete RM function
猜你喜欢

STM32 RT-Thread虚拟文件系统挂载操作

动态规划——62. 不同路径

单调栈——42. 接雨水——面大厂必须会的困难题

单调栈——739. 每日温度

MySQL事务的ACID特性及并发问题实例分析

Integrate SSM to realize search of addition, deletion, modification and query

What are the fragments of MySQL

C language to achieve a dynamic version of the address book

Practice of online problem feedback module (16): realize the function of checking details

Prefix-Tuning: Optimizing Continuous Prompts for Generation
随机推荐
CF 7月25日-7月31日做题记录
Use of custom annotations
光年(Light Year Admin)后台管理系统模板
【OPENVX】对象基本使用之vx_lut
SSM integration (integrated configuration)
How to solve the problem of win11 black desktop background?
xctf攻防世界 Web高手进阶区 unserialize3
MySQL事务的ACID特性及并发问题实例分析
Tensorboard usage record
verticle-align行内元素垂直居中对齐
ASEMI整流桥GBPC3510在直流有刷电机中的妙用
VMware virtual machine network settings
How to reinstall win11 system with one click
203. Remove linked list elements
20220727 use the Bluetooth module hc-05 of Huicheng technology to pair mobile phones for Bluetooth serial port demonstration
The wonderful use of asemi rectifier bridge GBPC3510 in DC brush motor
做自动化测试,你后悔了吗?
Super nice PHP program source code of nteam official website
接口自动化测试,完整入门篇
一篇文章掌握Postgresql中对于日期类数据的计算和处理
