一、最小调整代价

给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。

样例

对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。

思路: 我们规定每个位置出现的数字都在0-100以内,然后先得出第一个数字上出现0-100的调整代价,最后得出第一行的调整代价,然后从第二行开始基于第一行上次调整后的数字进行调整,这时候就要注意target的约束条件了。然后比较调整后是不是变小了,如果变小了,就更新下。 以后的每一行都基于此。

代码:

    public static int MinAdjustmentCost(List<Integer> A, int target) {// write your code hereint len = A.size();int[][] f = new int[len][101];for (int i = 0; i <= 100; i++) {f[0][i] = Math.abs(A.get(0)-i);}for (int i = 1; i < len; i++) {for (int j = 0; j <= 100; j++) {f[i][j] = Integer.MAX_VALUE;     // 赋初值}}for (int i = 1; i < len; i++) {for (int j = 0; j <= 100; j++) {if(f[i-1][j]!=Integer.MAX_VALUE){for (int k = 0; k <= 100; k++) {if(Math.abs(j-k)<=target){f[i][k] = Math.min(f[i][k],f[i-1][j]+Math.abs(k-A.get(i)));}}}}}int res = Integer.MAX_VALUE;for (int i = 0; i <= 100; i++) {res = Math.min(res, f[len-1][i]);}return res;}

二、杆子分割

描述

给一个 n 英寸长的杆子和一个包含所有小于 n 的尺寸的价格. 确定通过切割杆并销售碎片可获得的最大值.例如,如果棒的长度为8,并且不同长度部件的值如下,则最大可获得值为 22(通过切割两段长度 2 和 6 )

您在真实的面试中是否遇到过这个题?  是

样例

长度    | 1   2   3   4   5   6   7   8
--------------------------------------------
价格    | 1   5   8   9  10  17  17  20

给出 price = [1, 5, 8, 9, 10, 17, 17, 20], n = 8 返回 22//切成长度为 2 和 6 的两段

长度    | 1   2   3   4   5   6   7   8
--------------------------------------------
价格    | 3   5   8   9  10  17  17  20

给出 price = [3, 5, 8, 9, 10, 17, 17, 20], n = 8 返回 24//切成长度为 1 的 8 段

思路:仔细分析下题目,其实就是一个完全背包问题,每个长度的分段都可以重复使用。

完全背包问题的转移方程:

但是可以使用一个一维的数组从左到右遍历,f(i,v) 其实就是f(v),然后f(i-1,v-k*c[i])其实就是f(v-k*c[i]。

完全背包的代码如下:

public class Solution {public int backPackIII(int[] A, int[] V, int m) {int[] dp = new int[m+1];for (int i = 0; i < A.length; i++) {for (int j = 1; j <= m; j++) {if (j >= A[i]) dp[j] = Math.max(dp[j], dp[j-A[i]]+V[i]);}}return dp[m];}
}

本题的代码如下:

    public int cutting(int[] prices, int n) {// Write your code hereint[] f = new int[n+1];for (int i = 1; i <= n; i++) {for (int j = 1; j <=n ; j++) {if(j>=i){f[j] = Math.max(f[j],f[j-i]+prices[i-1]);}}}return f[n];}

三、换硬币

描述

给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.

样例

给出 coins = [1, 2, 5], amount = 11
返回 3 (11 = 5 + 5 + 1)
给出 coins = [2], amount = 3
返回 -1

代码:

    public int coinChange(int[] coins, int amount) {// write your code hereif(amount<0){return -1;}if(amount==0){return 0;}int sum[] = new int[amount+1];for (int i = 0; i < coins.length; i++) {if(coins[i]<=amount && coins[i]!=0){sum[coins[i]] = 1;}}for (int i = 1; i <= amount; i++) {sum[i] = -1;for (int j = 0; j < coins.length; j++) {if(i>=coins[j] && sum[i-coins[j]]!=-1){if(sum[i-coins[j]]+1<sum[i] || sum[i]==-1){sum[i] = sum[i-coins[j]]+1;}}}}return sum[amount];}

Lintcode 背包专题:最小调整代价,杆子分割,换硬币相关推荐

  1. Java动态规划---矩阵链相乘的最小计算代价

    参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...

  2. 动态规划示例汇总-Java版(组合硬币、跳台阶、最小路径和、最长递增子序列、最长公共子序列、01背包问题、最小编辑代价)

    动态规划算法示例汇总-Java版 组合硬币 Java解题-暴力搜索 Java解题-记忆搜索 Java解题-动态规划(两种写法) 跳台阶 Java解题-暴力递归 Java解题-动态规划 矩阵最小路径和 ...

  3. 最小总代价(洛谷-U17433)

    题目描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人 ...

  4. 程序员面试金典——17.6最小调整有序

    程序员面试金典--17.6最小调整有序 Solution1:我的答案.垃圾算法 class Rearrange { public:vector<int> findSegment(vecto ...

  5. 【华为OD机试真题 python】特异性双端队列 | 最小调整顺序次数【2022 Q4 | 100分】

    ■ 题目描述 [特异性双端队列 | 最小调整顺序次数] 给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据. 输入一个数字n,会依次添加数字1~n(也 ...

  6. 【特异性双端队列 | 最小调整顺序次数】

    题目描述 [特异性双端队列 | 最小调整顺序次数] 给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据. 输入一个数字n,会依次添加数字1~n(也就是 ...

  7. 【白板推导系列笔记】降维-PCA-最大投影方差最小重构代价

    作者:shuhuai008 链接:[机器学习][白板推导系列][合集 1-33]_哔哩哔哩_bilibili PCA的核心就是对原始特征空间的重构(将一组可能线性相关的变量,通过正交变换变换成一组线性 ...

  8. 【实战篇:粘连物体分割——利用几何分割实现硬币分割检测】

    实战篇:粘连物体分割--利用角点检测.定ROI区域.透视变换.几何分割实现硬币分割计数 一.背景 二.思路 三.代码 四.效果 五.声明 六.其他文章 一.背景     前面分享过一篇文章,是利用几何 ...

  9. 霍夫曼树之切割木板最小总代价问题

    对于本题的切割方案,在给出了最终的切割结果后,我们其实可以使用倒推的方法,将最终的小木板不断合成大木板,大木板的长度就是本次合并的开销,和相同条件下的切割的开销是一样的. 这样想的话,想要总开销小的话 ...

最新文章

  1. Matlab与线性代数--矩阵的奇异值和奇异值分解
  2. 机器视觉:Caffe Python接口多进程提取特征
  3. Leecode之翻转整数
  4. php判断ip地址小程序
  5. 【读书笔记】阅读的危险
  6. CXF与Web项目集成---without Spring
  7. 无法连接远程计算机,远程桌面由于以下原因之一无法连接到远程计算机
  8. 猪肉种类,全国“名猪”大盘点
  9. 最近抖音超火的60帧高清视频制作教程
  10. Navicat Premium基本使用
  11. 《近匠》专访启明星辰安全研究中心副总监侯浩俊——物联网安全攻防的“线上幽灵”...
  12. java吸血鬼_吸血鬼数
  13. 这款吊打Chrome、Edge的浏览器,时隔573天再度更新
  14. HTML强制视频倍速,强行网页视频倍速播放
  15. 如何设置桌面图标大小
  16. 期货开户加一分高交返靠谱吗?
  17. available: expected single matching bean but found 2
  18. 深度学习系列笔记——贰 (基于Tensorflow2 Keras搭建的猫狗大战模型 三)
  19. 我的2017年广州IT公司从入职到离职
  20. 移动通信平台的搭建(可语音可视屏可收发短信)

热门文章

  1. Commandline 工具mms使用/mmsctl
  2. java毕业生设计校园面包超市系统计算机源码+系统+mysql+调试部署+lw
  3. Linux下创建目录没有权限如何解决
  4. 无需删除D盘文件,将D盘空间分给C盘
  5. 电商直播系统源码:电商app的类型都有哪些?
  6. mycat分库分表+springcloud微服务小案例实现
  7. pytorch官网教程:cifar10代码理解
  8. Android携程高级用法,Android真正仿携程首页view实现
  9. 三维场景中常用的路径动画
  10. unturned服务器配置文件,unturned服务器配置