Files
python/TangDou/AcWing/BeiBao/【总结】脑图形式(二维)总结.md
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

130 lines
3.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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