Unverified Commit b4edc2a0 authored by Trisolaris HD's avatar Trisolaris HD Committed by GitHub
Browse files

Update knapsack.md

parent 49d77a4e
Loading
Loading
Loading
Loading
+42 −42
Original line number Diff line number Diff line
@@ -150,7 +150,7 @@ int main() {

??? 二进制分组代码

```c++
    ```cpp
    index = 0;
    for(int i = 1; i <= m; i++) {
        int c = 1, p, h, k;
@@ -172,7 +172,7 @@ int main() {

这种题目看起来很吓人,可是只要领悟了前面几种背包的中心思想,并将其合并在一起就可以了。下面给出伪代码:

```c++
```cpp
for (循环物品种类)
{
    if (0-1背包)
@@ -196,7 +196,7 @@ for (循环物品种类)

例题核心代码:

```c++
```cpp
for (int k=1;k<=n;k++)
{
    for (int i=m;i>=mi;i--)//对经费进行一层枚举
@@ -217,7 +217,7 @@ for (int k=1;k<=n;k++)

例题核心代码:

```c++
```cpp
for (int k=1;k<=ts;k++)//循环每一组
        for (int i=m;i>=0;i--)//循环背包容量
            for (int j=1;j<=cnt[k];j++)//循环该组的每一个物品
@@ -254,7 +254,7 @@ for (int k=1;k<=ts;k++)//循环每一组

输出方案其实就是记录下来背包中的某一个状态是怎么推出来的。我们可以用$g_{i,v}$表示第$i$件物品占用空间为$v$的时候是否选择了此物品。然后在转移时记录是选用了哪一种策略(选或不选)。输出时的伪代码:

```c++
```cpp
int v=V;//记录当前的存储空间
for (从最后一件循环至第一件)//因为最后一件物品存储的是最终状态,所以从最后一件物品进行循环
{
@@ -284,12 +284,12 @@ $$

#### 求最优方案总数

坑待填
坑待填

#### 求第 k 优解

坑待填
坑待填

### 参考资料

dd大牛(崔添翼)的背包九讲,GitHub仓库链接:[tianyicui/pack: 背包问题九讲](https://github.com/tianyicui/pack)
dd大牛(崔添翼)的背包九讲,GitHub仓库链接:[tianyicui/pack: 背包问题九讲](https://github.com/tianyicui/pack)