97 lines
2.2 KiB
Markdown
97 lines
2.2 KiB
Markdown
# 背包问题(一维求法)
|
||
|
||
## 求方案数
|
||
|
||
- 体积至多$j$
|
||
- 初始:$f[i]=1$,$0<=i<=m$,其余为$0$
|
||
- $01$背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] += f[j - v];
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = v; j <= m; j++) f[j] += f[j - v];
|
||
```
|
||
- 体积恰好$j$
|
||
- 初始:$f[0]=1$,其余为$0$
|
||
- $01$背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] += f[j - v];
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = v; j <= m; j++) f[j] += f[j - v];
|
||
```
|
||
- 体积至少$j$
|
||
- 初始:$f[0]=1$,其余为$0$
|
||
- $01$背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= 0; j--) f[j] += f[max(0, j - v)];
|
||
```
|
||
- 完全背包代码
|
||
-
|
||
<font color='red' size=4><b>有无穷多组方案数,不这么问</b></font>
|
||
|
||
|
||
## 求最大/小值
|
||
|
||
- 体积至多$j$
|
||
- 初始:$f[i]=0,0 <= i <= m$
|
||
- $01$背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] = max(f[j], f[j - v] + w);
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = v; j <= m; j++) f[j] = max(f[j], f[j - v] + w);
|
||
```
|
||
- 体积恰好$j$
|
||
- 求最小值
|
||
- 初始化$f[0]=0$,其它是$INF$
|
||
- 01 背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] = min(f[j], f[j - v] + w);
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = v; j <= m; j++) f[j] = min(f[j], f[j - v] + w);
|
||
```
|
||
- 求最大值
|
||
- 初始化$f[0]=0$, 其余是$−INF$
|
||
- 01背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] = max(f[j], f[j - v] + w);
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = v; j <= m; j++) f[j] = max(f[j], f[j - v] + w);
|
||
```
|
||
- 体积至少$j$
|
||
- 求最小值
|
||
- 初始化$f[0]=0$, 其余是$INF$
|
||
- 01背包
|
||
-
|
||
```c++
|
||
for (int j = m; j >= v; j--) f[j] = min(f[j], f[max(0, j - v)] + w);
|
||
```
|
||
- 完全背包
|
||
-
|
||
```c++
|
||
for (int j = 0; j <= m; j++) f[j] = min(f[j], f[max(0, j - v)] + w);
|
||
```
|
||
- 求最大值
|
||
- <font color='red' size=4><b>没有求最大值的</b></font>
|
||
|
||
|
||
|