填满背包的最大价格
难度:
标签:
题目描述
代码结果
运行时间: 205 ms, 内存: 57.4 MB
/*
* 题目编号:2548
* 题目:填满背包的最大价格
* 思路:
* 1. 这是一个经典的01背包问题。
* 2. 我们需要一个数组dp,其中dp[i]表示填满容量为i的背包所能获得的最大价格。
* 3. 对于每个物品,我们有两种选择,放入背包或者不放入背包。
* 4. 如果不放入背包,则当前dp值不变。
* 5. 如果放入背包,则更新dp值为dp[i - weight] + value。
* 6. 最后dp[maxCapacity]就是我们所求的结果。
* 使用Java Stream来实现主要是利用IntStream来简化循环。
*/
import java.util.stream.IntStream;
public class SolutionStream {
public int fillBackpack(int maxCapacity, int[] weights, int[] values) {
int n = weights.length;
int[] dp = new int[maxCapacity + 1];
IntStream.range(0, n).forEach(i ->
IntStream.iterate(maxCapacity, j -> j >= weights[i], j -> j - 1).forEach(j ->
dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i])
)
);
return dp[maxCapacity];
}
}
解释
方法:
这个题解采用了贪心算法的思想。首先定义一个辅助函数 sort_key 来计算每个物品的单位质量的价值(价格除以重量),并按照这个价值从高到低进行排序。然后检查所有物品的总重量是否小于背包容量,如果小于则直接返回 -1 表示无法填满背包。接下来遍历排序后的物品列表,优先选择单位价值高的物品加入背包,如果当前物品的重量超过了剩余的背包容量,则按照其单位价值取相应比例的物品填满背包,计算对应的价格,并结束循环。
时间复杂度:
O(n log n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在总重量小于背包容量时直接返回 -1?这是否意味着背包一定要完全填满才算解决问题?
▷🦆
在对物品进行排序时,使用单位价值(价格除以重量)作为排序依据,这种方法在哪些情况下可能不是最优的?
▷🦆
如果在填充过程中遇到连续几个物品的重量都超过剩余容量,如何确保算法还能找到最优解?
▷🦆
该算法对物品列表进行了排序,是否考虑过在不改变物品原始顺序的情况下解决问题?会有什么不同的考量?
▷