Lintcode 背包专题:最小调整代价,杆子分割,换硬币
一、最小调整代价
给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数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 背包专题:最小调整代价,杆子分割,换硬币相关推荐
- Java动态规划---矩阵链相乘的最小计算代价
参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...
- 动态规划示例汇总-Java版(组合硬币、跳台阶、最小路径和、最长递增子序列、最长公共子序列、01背包问题、最小编辑代价)
动态规划算法示例汇总-Java版 组合硬币 Java解题-暴力搜索 Java解题-记忆搜索 Java解题-动态规划(两种写法) 跳台阶 Java解题-暴力递归 Java解题-动态规划 矩阵最小路径和 ...
- 最小总代价(洛谷-U17433)
题目描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人 ...
- 程序员面试金典——17.6最小调整有序
程序员面试金典--17.6最小调整有序 Solution1:我的答案.垃圾算法 class Rearrange { public:vector<int> findSegment(vecto ...
- 【华为OD机试真题 python】特异性双端队列 | 最小调整顺序次数【2022 Q4 | 100分】
■ 题目描述 [特异性双端队列 | 最小调整顺序次数] 给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据. 输入一个数字n,会依次添加数字1~n(也 ...
- 【特异性双端队列 | 最小调整顺序次数】
题目描述 [特异性双端队列 | 最小调整顺序次数] 给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据. 输入一个数字n,会依次添加数字1~n(也就是 ...
- 【白板推导系列笔记】降维-PCA-最大投影方差最小重构代价
作者:shuhuai008 链接:[机器学习][白板推导系列][合集 1-33]_哔哩哔哩_bilibili PCA的核心就是对原始特征空间的重构(将一组可能线性相关的变量,通过正交变换变换成一组线性 ...
- 【实战篇:粘连物体分割——利用几何分割实现硬币分割检测】
实战篇:粘连物体分割--利用角点检测.定ROI区域.透视变换.几何分割实现硬币分割计数 一.背景 二.思路 三.代码 四.效果 五.声明 六.其他文章 一.背景 前面分享过一篇文章,是利用几何 ...
- 霍夫曼树之切割木板最小总代价问题
对于本题的切割方案,在给出了最终的切割结果后,我们其实可以使用倒推的方法,将最终的小木板不断合成大木板,大木板的长度就是本次合并的开销,和相同条件下的切割的开销是一样的. 这样想的话,想要总开销小的话 ...
最新文章
- Matlab与线性代数--矩阵的奇异值和奇异值分解
- 机器视觉:Caffe Python接口多进程提取特征
- Leecode之翻转整数
- php判断ip地址小程序
- 【读书笔记】阅读的危险
- CXF与Web项目集成---without Spring
- 无法连接远程计算机,远程桌面由于以下原因之一无法连接到远程计算机
- 猪肉种类,全国“名猪”大盘点
- 最近抖音超火的60帧高清视频制作教程
- Navicat Premium基本使用
- 《近匠》专访启明星辰安全研究中心副总监侯浩俊——物联网安全攻防的“线上幽灵”...
- java吸血鬼_吸血鬼数
- 这款吊打Chrome、Edge的浏览器,时隔573天再度更新
- HTML强制视频倍速,强行网页视频倍速播放
- 如何设置桌面图标大小
- 期货开户加一分高交返靠谱吗?
- available: expected single matching bean but found 2
- 深度学习系列笔记——贰 (基于Tensorflow2 Keras搭建的猫狗大战模型 三)
- 我的2017年广州IT公司从入职到离职
- 移动通信平台的搭建(可语音可视屏可收发短信)
热门文章
- Commandline 工具mms使用/mmsctl
- java毕业生设计校园面包超市系统计算机源码+系统+mysql+调试部署+lw
- Linux下创建目录没有权限如何解决
- 无需删除D盘文件,将D盘空间分给C盘
- 电商直播系统源码:电商app的类型都有哪些?
- mycat分库分表+springcloud微服务小案例实现
- pytorch官网教程:cifar10代码理解
- Android携程高级用法,Android真正仿携程首页view实现
- 三维场景中常用的路径动画
- unturned服务器配置文件,unturned服务器配置