mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-17 06:00:58 +00:00
deploy
This commit is contained in:
@@ -3407,8 +3407,8 @@
|
||||
<p>本题和 0-1 背包整体上非常相似,状态包含当前物品 <span class="arithmatex">\(i\)</span> 和容量 <span class="arithmatex">\(c\)</span> ,目标是求不超过背包容量下的最大价值。</p>
|
||||
<p>不同点在于,本题允许只选择物品的一部分,<strong>这意味着可以对物品任意地进行切分,并按照重量比例来计算物品价值</strong>,因此有:</p>
|
||||
<ol>
|
||||
<li>对于物品 <span class="arithmatex">\(i\)</span> ,它在单位重量下的价值为 <span class="arithmatex">\(val[i-1] / wgt[i-1]\)</span> ,简称为单位价值;</li>
|
||||
<li>假设放入一部分物品 <span class="arithmatex">\(i\)</span> ,重量为 <span class="arithmatex">\(w\)</span> ,则背包增加的价值为 <span class="arithmatex">\(w \times val[i-1] / wgt[i-1]\)</span> ;</li>
|
||||
<li>对于物品 <span class="arithmatex">\(i\)</span> ,它在单位重量下的价值为 <span class="arithmatex">\(val[i-1] / wgt[i-1]\)</span> ,简称为单位价值。</li>
|
||||
<li>假设放入一部分物品 <span class="arithmatex">\(i\)</span> ,重量为 <span class="arithmatex">\(w\)</span> ,则背包增加的价值为 <span class="arithmatex">\(w \times val[i-1] / wgt[i-1]\)</span> 。</li>
|
||||
</ol>
|
||||
<p><img alt="物品在单位重量下的价值" src="../fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png" /></p>
|
||||
<p align="center"> Fig. 物品在单位重量下的价值 </p>
|
||||
|
||||
@@ -3418,8 +3418,8 @@ cap[i, j] = \min(ht[i], ht[j]) \times (j - i)
|
||||
|
||||
<p>我们发现,<strong>如果此时将长板 <span class="arithmatex">\(j\)</span> 向短板 <span class="arithmatex">\(i\)</span> 靠近,则容量一定变小</strong>。这是因为在移动长板 <span class="arithmatex">\(j\)</span> 后:</p>
|
||||
<ul>
|
||||
<li>宽度 <span class="arithmatex">\(j-i\)</span> 肯定变小;</li>
|
||||
<li>高度由短板决定,因此高度只可能不变( <span class="arithmatex">\(i\)</span> 仍为短板)或变小(移动后的 <span class="arithmatex">\(j\)</span> 成为短板);</li>
|
||||
<li>宽度 <span class="arithmatex">\(j-i\)</span> 肯定变小。</li>
|
||||
<li>高度由短板决定,因此高度只可能不变( <span class="arithmatex">\(i\)</span> 仍为短板)或变小(移动后的 <span class="arithmatex">\(j\)</span> 成为短板)。</li>
|
||||
</ul>
|
||||
<p><img alt="向内移动长板后的状态" src="../max_capacity_problem.assets/max_capacity_moving_long_board.png" /></p>
|
||||
<p align="center"> Fig. 向内移动长板后的状态 </p>
|
||||
|
||||
@@ -3588,7 +3588,7 @@ n = 3 a + b
|
||||
|
||||
<p><strong>时间复杂度取决于编程语言的幂运算的实现方法</strong>。以 Python 为例,常用的幂计算函数有三种:</p>
|
||||
<ul>
|
||||
<li>运算符 <code>**</code> 和函数 <code>pow()</code> 的时间复杂度均为 <span class="arithmatex">\(O(\log a)\)</span> ;</li>
|
||||
<li>运算符 <code>**</code> 和函数 <code>pow()</code> 的时间复杂度均为 <span class="arithmatex">\(O(\log a)\)</span> 。</li>
|
||||
<li>函数 <code>math.pow()</code> 内部调用 C 语言库的 <code>pow()</code> 函数,其执行浮点取幂,时间复杂度为 <span class="arithmatex">\(O(1)\)</span> 。</li>
|
||||
</ul>
|
||||
<p>变量 <span class="arithmatex">\(a\)</span> , <span class="arithmatex">\(b\)</span> 使用常数大小的额外空间,<strong>因此空间复杂度为 <span class="arithmatex">\(O(1)\)</span></strong> 。</p>
|
||||
|
||||
Reference in New Issue
Block a user