mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-13 15:56:05 +00:00
Update punctuation
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
!!! question
|
||||
|
||||
给定 $n$ 个物品,第 $i$ 个物品的重量为 $wgt[i-1]$ 、价值为 $val[i-1]$ ,和一个容量为 $cap$ 的背包。每个物品只能选择一次,**但可以选择物品的一部分,价值根据选择的重量比例计算**,问在不超过背包容量下背包中物品的最大价值。
|
||||
给定 $n$ 个物品,第 $i$ 个物品的重量为 $wgt[i-1]$、价值为 $val[i-1]$ ,和一个容量为 $cap$ 的背包。每个物品只能选择一次,**但可以选择物品的一部分,价值根据选择的重量比例计算**,问在不超过背包容量下背包中物品的最大价值。
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ $$
|
||||
|
||||
### 贪心策略确定
|
||||
|
||||
这道题还有更高效率的解法。如下图所示,现选取一个状态 $[i, j]$ ,其满足索引 $i < j$ 且高度 $ht[i] < ht[j]$ ,即 $i$ 为短板、 $j$ 为长板。
|
||||
这道题还有更高效率的解法。如下图所示,现选取一个状态 $[i, j]$ ,其满足索引 $i < j$ 且高度 $ht[i] < ht[j]$ ,即 $i$ 为短板、$j$ 为长板。
|
||||
|
||||

|
||||
|
||||
@@ -40,10 +40,10 @@ $$
|
||||
|
||||
下图展示了贪心策略的执行过程。
|
||||
|
||||
1. 初始状态下,指针 $i$ , $j$ 分列与数组两端。
|
||||
1. 初始状态下,指针 $i$ 和 $j$ 分列与数组两端。
|
||||
2. 计算当前状态的容量 $cap[i, j]$ ,并更新最大容量。
|
||||
3. 比较板 $i$ 和 板 $j$ 的高度,并将短板向内移动一格。
|
||||
4. 循环执行第 `2.` , `3.` 步,直至 $i$ 和 $j$ 相遇时结束。
|
||||
4. 循环执行第 `2.` 和 `3.` 步,直至 $i$ 和 $j$ 相遇时结束。
|
||||
|
||||
=== "<1>"
|
||||

|
||||
@@ -76,7 +76,7 @@ $$
|
||||
|
||||
代码循环最多 $n$ 轮,**因此时间复杂度为 $O(n)$** 。
|
||||
|
||||
变量 $i$ , $j$ , $res$ 使用常数大小额外空间,**因此空间复杂度为 $O(1)$** 。
|
||||
变量 $i$、$j$、$res$ 使用常数大小额外空间,**因此空间复杂度为 $O(1)$** 。
|
||||
|
||||
=== "Java"
|
||||
|
||||
|
||||
@@ -34,11 +34,11 @@ $$
|
||||
|
||||
如下图所示,当 $n \geq 4$ 时,切分出一个 $2$ 后乘积会变大,**这说明大于等于 $4$ 的整数都应该被切分**。
|
||||
|
||||
**贪心策略一**:如果切分方案中包含 $\geq 4$ 的因子,那么它就应该被继续切分。最终的切分方案只应出现 $1$ , $2$ , $3$ 这三种因子。
|
||||
**贪心策略一**:如果切分方案中包含 $\geq 4$ 的因子,那么它就应该被继续切分。最终的切分方案只应出现 $1$、$2$、$3$ 这三种因子。
|
||||
|
||||

|
||||
|
||||
接下来思考哪个因子是最优的。在 $1$ , $2$ , $3$ 这三个因子中,显然 $1$ 是最差的,因为 $1 \times (n-1) < n$ 恒成立,即切分出 $1$ 反而会导致乘积减小。
|
||||
接下来思考哪个因子是最优的。在 $1$、$2$、$3$ 这三个因子中,显然 $1$ 是最差的,因为 $1 \times (n-1) < n$ 恒成立,即切分出 $1$ 反而会导致乘积减小。
|
||||
|
||||
如下图所示,当 $n = 6$ 时,有 $3 \times 3 > 2 \times 2 \times 2$ 。**这意味着切分出 $3$ 比切分出 $2$ 更优**。
|
||||
|
||||
@@ -48,7 +48,7 @@ $$
|
||||
|
||||
总结以上,可推出以下贪心策略。
|
||||
|
||||
1. 输入整数 $n$ ,从其不断地切分出因子 $3$ ,直至余数为 $0$ , $1$ , $2$ 。
|
||||
1. 输入整数 $n$ ,从其不断地切分出因子 $3$ ,直至余数为 $0$、$1$、$2$ 。
|
||||
2. 当余数为 $0$ 时,代表 $n$ 是 $3$ 的倍数,因此不做任何处理。
|
||||
3. 当余数为 $2$ 时,不继续划分,保留之。
|
||||
4. 当余数为 $1$ 时,由于 $2 \times 2 > 1 \times 3$ ,因此应将最后一个 $3$ 替换为 $2$ 。
|
||||
@@ -142,7 +142,7 @@ $$
|
||||
- 运算符 `**` 和函数 `pow()` 的时间复杂度均为 $O(\log a)$ 。
|
||||
- 函数 `math.pow()` 内部调用 C 语言库的 `pow()` 函数,其执行浮点取幂,时间复杂度为 $O(1)$ 。
|
||||
|
||||
变量 $a$ , $b$ 使用常数大小的额外空间,**因此空间复杂度为 $O(1)$** 。
|
||||
变量 $a$ 和 $b$ 使用常数大小的额外空间,**因此空间复杂度为 $O(1)$** 。
|
||||
|
||||
### 正确性证明
|
||||
|
||||
|
||||
Reference in New Issue
Block a user