当前位置: 首页 > article >正文

11 动态规划解最后一块石头的重量II

来源:LeetCode第1049题

难度:中等

描述:有一堆石头,用证书数组stones表示,其中stones[i]表示第i块石头的重量,每一回合,从中选出任意两块石头,然后将他们放在一起粉碎,假设石头的重量分别为x和y,且x<=y,那么可能粉碎的结果可能如下:
        如果x==y,那么两块石头会被完全粉碎
        如果x!=y,那么重量为x的石头将会完全被粉碎,而重量y的石头新重量为y-x,最后最多只剩下一块石头,最多只会剩下一块石头,返回此石头可能最小重量。

思路解析:该题可以看做是一个背包问题,将stones数组分为重量尽可能接近的两队,然后两队之间的差值即是此石头最后的重量,可以定义二维动态规划数组dp[i][j]表示从前i个元素中挑选出元素放入容量为j的背包所能达到的最大值,对于每个元素都可以选或者不选;

public int getLastStone(int []stones)
{
int sum=0;
for(int number:stones)
{
sum+=number;
}
int dp[][]=new int[stones.length][sum>>1];
dp[0][0]=0;
for(int i=1;i<stones.length;i++)
{
dp[i][0]=0;
}
for(int i=1;i<stones.length;i++)
{
for(int j=1;j<sum>>1;j++)
{
if(stones[i]<=j)
{
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-stones[i]]+stones[i]);
}else
{
dp[i][j]=dp[i-1][j];
}
}
}
return Math.abs(dp[stones.length-1][sum>>1]-sum);
}


http://www.kler.cn/a/148818.html

相关文章:

  • LeetCode59. 螺旋矩阵 II
  • LeetCode面试经典150题C++实现,更新中
  • 怎么选择香港服务器的线路?解决方案
  • Vim 编辑器学习笔记
  • 前端vue 列表中回显并下拉选择修改标签
  • 软件工程师简历(精选篇)
  • TiDB 在咪咕云原生场景下的实践
  • 人工智能原理复习--知识表示(一)
  • 图论 2023.11.27
  • springboot 自定义starter逐级抽取
  • MATLAB算法实战应用案例精讲-【图像处理】FPGA
  • 编写安全 JavaScript 代码的最佳实践
  • Gossip协议理解
  • Android控件全解手册 - 任意View缩放平移工具-实现思路和讲解
  • 京东大数据(京东运营数据采集):2023年10月京东牛奶乳品行业品牌销售排行榜
  • 解决:SyntaxError: Non-UTF-8 code starting with À in file but no encoding declared
  • pgsql分别获取日期中的年、月、日,并处理前台展示有小数点的情况
  • STM32CubeIDE(ADC)
  • C++面试,说明const和#define的特点和区别
  • 基于单片机的智能饮水机控制系统(论文+源码)
  • JAVA进阶之路JVM-2:类加载机制,类的生命周期,类加载过程,类加载时机,类加载器,双亲委派模型,对象创建过程
  • LuatOS-SOC接口文档(air780E)--rtc - 实时时钟
  • uniapp微信小程序中阻止事件冒泡
  • 如何根据接口文档,轻松快速的模拟接口服务?
  • Java小游戏 王者荣耀
  • 安卓横竖屏切换后,应用只展示半屏问题 AndroidAutoSize