This commit is contained in:
krahets
2023-09-22 13:08:10 +08:00
parent 5bb9f76fbc
commit 6fffa33695
107 changed files with 2561 additions and 19178 deletions

View File

@ -60,7 +60,18 @@
</head>
<link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: white; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}
</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
@ -1875,14 +1886,6 @@
10.2 &nbsp; 二分查找插入点
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -1903,14 +1906,6 @@
10.3 &nbsp; 二分查找边界
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2330,14 +2325,6 @@
第 12 章 &nbsp; 分治
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2369,14 +2356,6 @@
12.1 &nbsp; 分治算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2397,14 +2376,6 @@
12.2 &nbsp; 分治搜索策略
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2425,14 +2396,6 @@
12.3 &nbsp; 构建树问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2453,14 +2416,6 @@
12.4 &nbsp; 汉诺塔问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2481,14 +2436,6 @@
12.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2722,14 +2669,6 @@
第 14 章 &nbsp; 动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2761,14 +2700,6 @@
14.1 &nbsp; 初探动态规划
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2789,14 +2720,6 @@
14.2 &nbsp; DP 问题特性
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2817,14 +2740,6 @@
14.3 &nbsp; DP 解题思路
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2854,14 +2769,6 @@
14.4 &nbsp; 0-1 背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
<span class="md-nav__icon md-icon"></span>
</label>
@ -2873,14 +2780,6 @@
14.4 &nbsp; 0-1 背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -2949,14 +2848,6 @@
14.5 &nbsp; 完全背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -2977,14 +2868,6 @@
14.6 &nbsp; 编辑距离问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3005,14 +2888,6 @@
14.7 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3071,14 +2946,6 @@
第 15 章 &nbsp; 贪心
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
@ -3110,14 +2977,6 @@
15.1 &nbsp; 贪心算法
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3138,14 +2997,6 @@
15.2 &nbsp; 分数背包问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3166,14 +3017,6 @@
15.3 &nbsp; 最大容量问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3194,14 +3037,6 @@
15.4 &nbsp; 最大切分乘积问题
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3222,14 +3057,6 @@
15.5 &nbsp; 小结
</span>
<span class="md-status md-status--new" title="最近添加">
</span>
</a>
</li>
@ -3517,7 +3344,7 @@
<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> 的背包。每个物品只能选择一次,问在不超过背包容量下能放入物品的最大价值。</p>
</div>
<p>观察图 14-17 ,由于物品编号 <span class="arithmatex">\(i\)</span><span class="arithmatex">\(1\)</span> 开始计数,数组索引从 <span class="arithmatex">\(0\)</span> 开始计数,因此物品 <span class="arithmatex">\(i\)</span> 对应重量 <span class="arithmatex">\(wgt[i-1]\)</span> 和价值 <span class="arithmatex">\(val[i-1]\)</span></p>
<p><img alt="0-1 背包的示例数据" src="../knapsack_problem.assets/knapsack_example.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_example.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="0-1 背包的示例数据" src="../knapsack_problem.assets/knapsack_example.png" /></a></p>
<p align="center"> 图 14-17 &nbsp; 0-1 背包的示例数据 </p>
<p>我们可以将 0-1 背包问题看作是一个由 <span class="arithmatex">\(n\)</span> 轮决策组成的过程,每个物体都有不放入和放入两种决策,因此该问题是满足决策树模型的。</p>
@ -3770,7 +3597,7 @@ dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1])
</div>
<p>如图 14-18 所示,由于每个物品都会产生不选和选两条搜索分支,因此时间复杂度为 <span class="arithmatex">\(O(2^n)\)</span></p>
<p>观察递归树,容易发现其中存在重叠子问题,例如 <span class="arithmatex">\(dp[1, 10]\)</span> 等。而当物品较多、背包容量较大,尤其是相同重量的物品较多时,重叠子问题的数量将会大幅增多。</p>
<p><img alt="0-1 背包的暴力搜索递归树" src="../knapsack_problem.assets/knapsack_dfs.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dfs.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="0-1 背包的暴力搜索递归树" src="../knapsack_problem.assets/knapsack_dfs.png" /></a></p>
<p align="center"> 图 14-18 &nbsp; 0-1 背包的暴力搜索递归树 </p>
<h3 id="2">2. &nbsp; 方法二:记忆化搜索<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
@ -4061,7 +3888,7 @@ dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1])
</div>
</div>
<p>图 14-19 展示了在记忆化递归中被剪掉的搜索分支。</p>
<p><img alt="0-1 背包的记忆化搜索递归树" src="../knapsack_problem.assets/knapsack_dfs_mem.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dfs_mem.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="0-1 背包的记忆化搜索递归树" src="../knapsack_problem.assets/knapsack_dfs_mem.png" /></a></p>
<p align="center"> 图 14-19 &nbsp; 0-1 背包的记忆化搜索递归树 </p>
<h3 id="3">3. &nbsp; 方法三:动态规划<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
@ -4333,46 +4160,46 @@ dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1])
<div class="tabbed-set tabbed-alternate" data-tabs="4:14"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><input id="__tabbed_4_4" name="__tabbed_4" type="radio" /><input id="__tabbed_4_5" name="__tabbed_4" type="radio" /><input id="__tabbed_4_6" name="__tabbed_4" type="radio" /><input id="__tabbed_4_7" name="__tabbed_4" type="radio" /><input id="__tabbed_4_8" name="__tabbed_4" type="radio" /><input id="__tabbed_4_9" name="__tabbed_4" type="radio" /><input id="__tabbed_4_10" name="__tabbed_4" type="radio" /><input id="__tabbed_4_11" name="__tabbed_4" type="radio" /><input id="__tabbed_4_12" name="__tabbed_4" type="radio" /><input id="__tabbed_4_13" name="__tabbed_4" type="radio" /><input id="__tabbed_4_14" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">&lt;1&gt;</label><label for="__tabbed_4_2">&lt;2&gt;</label><label for="__tabbed_4_3">&lt;3&gt;</label><label for="__tabbed_4_4">&lt;4&gt;</label><label for="__tabbed_4_5">&lt;5&gt;</label><label for="__tabbed_4_6">&lt;6&gt;</label><label for="__tabbed_4_7">&lt;7&gt;</label><label for="__tabbed_4_8">&lt;8&gt;</label><label for="__tabbed_4_9">&lt;9&gt;</label><label for="__tabbed_4_10">&lt;10&gt;</label><label for="__tabbed_4_11">&lt;11&gt;</label><label for="__tabbed_4_12">&lt;12&gt;</label><label for="__tabbed_4_13">&lt;13&gt;</label><label for="__tabbed_4_14">&lt;14&gt;</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p><img alt="0-1 背包的动态规划过程" src="../knapsack_problem.assets/knapsack_dp_step1.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step1.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="0-1 背包的动态规划过程" src="../knapsack_problem.assets/knapsack_dp_step1.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step2" src="../knapsack_problem.assets/knapsack_dp_step2.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step2.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step2" src="../knapsack_problem.assets/knapsack_dp_step2.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step3" src="../knapsack_problem.assets/knapsack_dp_step3.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step3.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step3" src="../knapsack_problem.assets/knapsack_dp_step3.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step4" src="../knapsack_problem.assets/knapsack_dp_step4.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step4.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step4" src="../knapsack_problem.assets/knapsack_dp_step4.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step5" src="../knapsack_problem.assets/knapsack_dp_step5.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step5.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step5" src="../knapsack_problem.assets/knapsack_dp_step5.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step6" src="../knapsack_problem.assets/knapsack_dp_step6.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step6.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step6" src="../knapsack_problem.assets/knapsack_dp_step6.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step7" src="../knapsack_problem.assets/knapsack_dp_step7.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step7.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step7" src="../knapsack_problem.assets/knapsack_dp_step7.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step8" src="../knapsack_problem.assets/knapsack_dp_step8.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step8.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step8" src="../knapsack_problem.assets/knapsack_dp_step8.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step9" src="../knapsack_problem.assets/knapsack_dp_step9.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step9.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step9" src="../knapsack_problem.assets/knapsack_dp_step9.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step10" src="../knapsack_problem.assets/knapsack_dp_step10.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step10.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step10" src="../knapsack_problem.assets/knapsack_dp_step10.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step11" src="../knapsack_problem.assets/knapsack_dp_step11.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step11.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step11" src="../knapsack_problem.assets/knapsack_dp_step11.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step12" src="../knapsack_problem.assets/knapsack_dp_step12.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step12.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step12" src="../knapsack_problem.assets/knapsack_dp_step12.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step13" src="../knapsack_problem.assets/knapsack_dp_step13.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step13.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step13" src="../knapsack_problem.assets/knapsack_dp_step13.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_step14" src="../knapsack_problem.assets/knapsack_dp_step14.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_step14.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_step14" src="../knapsack_problem.assets/knapsack_dp_step14.png" /></a></p>
</div>
</div>
</div>
@ -4389,22 +4216,22 @@ dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1])
<div class="tabbed-set tabbed-alternate" data-tabs="5:6"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><input id="__tabbed_5_3" name="__tabbed_5" type="radio" /><input id="__tabbed_5_4" name="__tabbed_5" type="radio" /><input id="__tabbed_5_5" name="__tabbed_5" type="radio" /><input id="__tabbed_5_6" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">&lt;1&gt;</label><label for="__tabbed_5_2">&lt;2&gt;</label><label for="__tabbed_5_3">&lt;3&gt;</label><label for="__tabbed_5_4">&lt;4&gt;</label><label for="__tabbed_5_5">&lt;5&gt;</label><label for="__tabbed_5_6">&lt;6&gt;</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p><img alt="0-1 背包的空间优化后的动态规划过程" src="../knapsack_problem.assets/knapsack_dp_comp_step1.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step1.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="0-1 背包的空间优化后的动态规划过程" src="../knapsack_problem.assets/knapsack_dp_comp_step1.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_comp_step2" src="../knapsack_problem.assets/knapsack_dp_comp_step2.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step2.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_comp_step2" src="../knapsack_problem.assets/knapsack_dp_comp_step2.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_comp_step3" src="../knapsack_problem.assets/knapsack_dp_comp_step3.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step3.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_comp_step3" src="../knapsack_problem.assets/knapsack_dp_comp_step3.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_comp_step4" src="../knapsack_problem.assets/knapsack_dp_comp_step4.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step4.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_comp_step4" src="../knapsack_problem.assets/knapsack_dp_comp_step4.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_comp_step5" src="../knapsack_problem.assets/knapsack_dp_comp_step5.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step5.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_comp_step5" src="../knapsack_problem.assets/knapsack_dp_comp_step5.png" /></a></p>
</div>
<div class="tabbed-block">
<p><img alt="knapsack_dp_comp_step6" src="../knapsack_problem.assets/knapsack_dp_comp_step6.png" /></p>
<p><a class="glightbox" href="../knapsack_problem.assets/knapsack_dp_comp_step6.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="knapsack_dp_comp_step6" src="../knapsack_problem.assets/knapsack_dp_comp_step6.png" /></a></p>
</div>
</div>
</div>
@ -4809,10 +4636,15 @@ aria-label="页脚"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2023 Krahets
Copyright &copy; 2022 - 2023 Krahets
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<!-- Social links -->
@ -4881,5 +4713,5 @@ aria-label="页脚"
</body>
<script>document$.subscribe(() => {const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": false, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "none"});})</script></body>
</html>