This commit is contained in:
krahets
2023-08-27 23:41:10 +08:00
parent 8c9cf3f087
commit 016f13d882
66 changed files with 262 additions and 270 deletions

View File

@@ -3630,7 +3630,7 @@
<h2 id="1451">14.5.1 &nbsp; 完全背包<a class="headerlink" href="#1451" title="Permanent link">&para;</a></h2>
<div class="admonition question">
<p class="admonition-title">Question</p>
<p>给定 <span class="arithmatex">\(n\)</span> 个物品,第 <span class="arithmatex">\(i\)</span> 个物品的重量为 <span class="arithmatex">\(wgt[i-1]\)</span> 、价值为 <span class="arithmatex">\(val[i-1]\)</span> ,和一个容量为 <span class="arithmatex">\(cap\)</span> 的背包。<strong>每个物品可以重复选取</strong>,问在不超过背包容量下能放入物品的最大价值。</p>
<p>给定 <span class="arithmatex">\(n\)</span> 个物品,第 <span class="arithmatex">\(i\)</span> 个物品的重量为 <span class="arithmatex">\(wgt[i-1]\)</span>、价值为 <span class="arithmatex">\(val[i-1]\)</span> ,和一个容量为 <span class="arithmatex">\(cap\)</span> 的背包。<strong>每个物品可以重复选取</strong>,问在不超过背包容量下能放入物品的最大价值。</p>
</div>
<p><img alt="完全背包问题的示例数据" src="../unbounded_knapsack_problem.assets/unbounded_knapsack_example.png" /></p>
<p align="center"> 图 14-22 &nbsp; 完全背包问题的示例数据 </p>
@@ -3641,7 +3641,7 @@
<li>在 0-1 背包中,每个物品只有一个,因此将物品 <span class="arithmatex">\(i\)</span> 放入背包后,只能从前 <span class="arithmatex">\(i-1\)</span> 个物品中选择。</li>
<li>在完全背包中,每个物品有无数个,因此将物品 <span class="arithmatex">\(i\)</span> 放入背包后,<strong>仍可以从前 <span class="arithmatex">\(i\)</span> 个物品中选择</strong></li>
</ul>
<p>这就导致了状态转移的变化,对于状态 <span class="arithmatex">\([i, c]\)</span> 有:</p>
<p>在完全背包的规定下,状态 <span class="arithmatex">\([i, c]\)</span> 的变化分为两种情况。</p>
<ul>
<li><strong>不放入物品 <span class="arithmatex">\(i\)</span></strong> :与 0-1 背包相同,转移至 <span class="arithmatex">\([i-1, c]\)</span></li>
<li><strong>放入物品 <span class="arithmatex">\(i\)</span></strong> :与 0-1 背包不同,转移至 <span class="arithmatex">\([i, c-wgt[i-1]]\)</span></li>
@@ -4114,7 +4114,7 @@ dp[i, c] = \max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1])
<p align="center"> 图 14-24 &nbsp; 零钱兑换问题的示例数据 </p>
<h3 id="1_1">1. &nbsp; 动态规划思路<a class="headerlink" href="#1_1" title="Permanent link">&para;</a></h3>
<p><strong>零钱兑换可以看作是完全背包的一种特殊情况</strong>,两者具有以下联系与不同点</p>
<p><strong>零钱兑换可以看作是完全背包的一种特殊情况</strong>,两者具有以下联系与不同点</p>
<ul>
<li>两道题可以相互转换,“物品”对应于“硬币”、“物品重量”对应于“硬币面值”、“背包容量”对应于“目标金额”。</li>
<li>优化目标相反,背包问题是要最大化物品价值,零钱兑换问题是要最小化硬币数量。</li>
@@ -4124,7 +4124,7 @@ dp[i, c] = \max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1])
<p>状态 <span class="arithmatex">\([i, a]\)</span> 对应的子问题为:<strong><span class="arithmatex">\(i\)</span> 种硬币能够凑出金额 <span class="arithmatex">\(a\)</span> 的最少硬币个数</strong>,记为 <span class="arithmatex">\(dp[i, a]\)</span></p>
<p>二维 <span class="arithmatex">\(dp\)</span> 表的尺寸为 <span class="arithmatex">\((n+1) \times (amt+1)\)</span></p>
<p><strong>第二步:找出最优子结构,进而推导出状态转移方程</strong></p>
<p>与完全背包的状态转移方程基本相同,不同点在于:</p>
<p>本题与完全背包的状态转移方程存在以下两个差异。</p>
<ul>
<li>本题要求最小值,因此需将运算符 <span class="arithmatex">\(\max()\)</span> 更改为 <span class="arithmatex">\(\min()\)</span></li>
<li>优化主体是硬币数量而非商品价值,因此在选中硬币时执行 <span class="arithmatex">\(+1\)</span> 即可。</li>