描述
奥利第一次来到健身房,她正在计算她能举起的最大重量。杠铃所能承受的最大重量为maxCapacity,健身房里有n个杠铃片,第 i 个杠铃片的重量为 weights[i]。奥利现在需要选一些杠铃片加到杠铃上,使得杠铃的重量最大,但是所选的杠铃片重量总和又不能超过 maxCapacity ,请计算杠铃的最大重量是多少。
比如,给定杠铃片的重量为 weights = [1, 3, 5], 而杠铃的最大承重为 maxCapacity = 7,那么应该选择重量为 1 和 5 的杠铃片,(1 + 5 = 6),所以最终的答案是 6。
1≤n≤42
1≤maxCapacity≤106
1≤weights[i]≤106
在线评测地址:领扣题库官网
样例1 [1,3,5] 6
解题思路
经典的背包问题。
状态:dp[j] 表示是否存在一种杠铃片的选择方案使杠铃的重量达到 j 初始化:dp[0] = true 如果一个杠铃片都不选,杠铃的重量就是 0 转移:dp[j] = dp[j] || dp[j - weight[i]] 如果已经存在一种方案可以是杠铃的重量达到 j 或 j - weight[i] 答案:dp[maxCapacity]
复杂度分析
时间复杂度:O(n * maxCapacity)
枚举每个杠铃片 O(n),枚举每个重量 O(maxCapacity)。两者是嵌套关系,所以是O(n * maxCapacity)
空间复杂度:O(maxCapacity)
dp数组的空间耗费
源代码
public class Solution { * @param weights: An array of n integers, where the value of each element weights[i] is the weight of each plate i * @param maxCapacity: An integer, the capacity of the barbell * @return: an integer denoting the maximum capacity of items that she can lift. public int weightCapacity(int[] weights, int maxCapacity) { boolean[] dp = new boolean[maxCapacity + 1]; dp[0] = true; int answer = 0; for (int i = 0; i weights.length; i++) { int weight = weights[i]; for (int j = maxCapacity; j = weight; j--) { if (dp[j - weight]) { dp[j] = true; answer = Math.max(answer, j); return answer; }
更多题解参考:九章官网solution
虽然Java程序员不用像C/C++程序员那样时刻关注内存的使用情况,JVM会帮我们处理...
业务背景 目前团队内的开发模式多是面向组件的,UI层和逻辑层均强耦合在一起,由...
阿里云 域名 实名认证还需要备案吗?是否备案其实并不取决于你在哪里 注册域名 ...
随着生活水平的提高,人们对旅游品质需求不断提升,定制旅游越来越受到青睐,一...
近日,亚马逊云科技宣布Amazon Lookout for Vision正式可用,这是一项全新服务,...
芬兰手游公司SuperCell,用不到200名员工每年创造15亿美元利润。他们取得惊人成功...
基础设施与网络层面发生的问题,必须以闪电般的速度加以解决,在理想情况下,最...
案例背景 科技已成为各个行业的“新基建”,跟每个人息息相关的医疗行业也不例外...
当冠状病毒疫情在2020年初在全球爆发时,许多企业和政府部门发现处于一个前所未...
FTP软件的安装及上传/下载方法?在用主机 建站 的时候,会涉及到ftp的安装上传,...