mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-30 03:47:14 +00:00
build
This commit is contained in:
@@ -13,7 +13,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 分数背包问题的示例数据 </p>
|
||||
<p align="center"> 图:分数背包问题的示例数据 </p>
|
||||
|
||||
本题和 0-1 背包整体上非常相似,状态包含当前物品 $i$ 和容量 $c$ ,目标是求不超过背包容量下的最大价值。
|
||||
|
||||
@@ -24,7 +24,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 物品在单位重量下的价值 </p>
|
||||
<p align="center"> 图:物品在单位重量下的价值 </p>
|
||||
|
||||
### 贪心策略确定
|
||||
|
||||
@@ -36,7 +36,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 分数背包的贪心策略 </p>
|
||||
<p align="center"> 图:分数背包的贪心策略 </p>
|
||||
|
||||
### 代码实现
|
||||
|
||||
@@ -373,4 +373,4 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 分数背包问题的几何表示 </p>
|
||||
<p align="center"> 图:分数背包问题的几何表示 </p>
|
||||
|
||||
@@ -22,7 +22,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 零钱兑换的贪心策略 </p>
|
||||
<p align="center"> 图:零钱兑换的贪心策略 </p>
|
||||
|
||||
实现代码如下所示。你可能会不由地发出感叹:So Clean !贪心算法仅用十行代码就解决了零钱兑换问题。
|
||||
|
||||
@@ -233,7 +233,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 贪心无法找出最优解的示例 </p>
|
||||
<p align="center"> 图:贪心无法找出最优解的示例 </p>
|
||||
|
||||
也就是说,对于零钱兑换问题,贪心算法无法保证找到全局最优解,并且有可能找到非常差的解。它更适合用动态规划解决。
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 最大容量问题的示例数据 </p>
|
||||
<p align="center"> 图:最大容量问题的示例数据 </p>
|
||||
|
||||
容器由任意两个隔板围成,**因此本题的状态为两个隔板的索引,记为 $[i, j]$** 。
|
||||
|
||||
@@ -33,7 +33,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 初始状态 </p>
|
||||
<p align="center"> 图:初始状态 </p>
|
||||
|
||||
我们发现,**如果此时将长板 $j$ 向短板 $i$ 靠近,则容量一定变小**。这是因为在移动长板 $j$ 后:
|
||||
|
||||
@@ -42,13 +42,13 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 向内移动长板后的状态 </p>
|
||||
<p align="center"> 图:向内移动长板后的状态 </p>
|
||||
|
||||
反向思考,**我们只有向内收缩短板 $i$ ,才有可能使容量变大**。因为虽然宽度一定变小,**但高度可能会变大**(移动后的短板 $i$ 可能会变长)。
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 向内移动长板后的状态 </p>
|
||||
<p align="center"> 图:向内移动长板后的状态 </p>
|
||||
|
||||
由此便可推出本题的贪心策略:
|
||||
|
||||
@@ -84,6 +84,8 @@ $$
|
||||
=== "<9>"
|
||||

|
||||
|
||||
<p align="center"> 图:最大容量问题的贪心过程 </p>
|
||||
|
||||
### 代码实现
|
||||
|
||||
代码循环最多 $n$ 轮,**因此时间复杂度为 $O(n)$** 。
|
||||
@@ -305,7 +307,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 移动短板导致被跳过的状态 </p>
|
||||
<p align="center"> 图:移动短板导致被跳过的状态 </p>
|
||||
|
||||
观察发现,**这些被跳过的状态实际上就是将长板 $j$ 向内移动的所有状态**。而在第二步中,我们已经证明内移长板一定会导致容量变小。也就是说,被跳过的状态都不可能是最优解,**跳过它们不会导致错过最优解**。
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ status: new
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 最大切分乘积的问题定义 </p>
|
||||
<p align="center"> 图:最大切分乘积的问题定义 </p>
|
||||
|
||||
假设我们将 $n$ 切分为 $m$ 个整数因子,其中第 $i$ 个因子记为 $n_i$ ,即
|
||||
|
||||
@@ -45,7 +45,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 切分导致乘积变大 </p>
|
||||
<p align="center"> 图:切分导致乘积变大 </p>
|
||||
|
||||
接下来思考哪个因子是最优的。在 $1$ , $2$ , $3$ 这三个因子中,显然 $1$ 是最差的,因为 $1 \times (n-1) < n$ 恒成立,即切分出 $1$ 反而会导致乘积减小。
|
||||
|
||||
@@ -55,7 +55,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 最优切分因子 </p>
|
||||
<p align="center"> 图:最优切分因子 </p>
|
||||
|
||||
总结以上,可推出贪心策略:
|
||||
|
||||
@@ -276,7 +276,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 最大切分乘积的计算方法 </p>
|
||||
<p align="center"> 图:最大切分乘积的计算方法 </p>
|
||||
|
||||
**时间复杂度取决于编程语言的幂运算的实现方法**。以 Python 为例,常用的幂计算函数有三种:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user