Files
python/TangDou/AcWing/BeiBao/【总结】方案数-空间恰好j.md
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

134 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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$
### 一、$01$背包
例子:给你一堆物品,每个物品有一定的体积,每个物品**只能选一个**,求 <font color='blue' size=4><b>总体积恰好是$m$</b></font>的 <font color='red' size=4><b>方案数</b></font>
输入
```c++
4 5
2 2 3 7
```
输出
```c++
2
```
#### 1、二维
```c++
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m;
int f[N][N];
int main() {
//文件输入
freopen("QiaHao_01.in", "r", stdin);
scanf("%d %d", &n, &m);
// 恰好,在有前i种物品可以选择的情况下,只有空间为0有一种方案,就是啥都不选
for (int i = 0; i <= n; i++) f[i][0] = 1;
// 由于下面的代码中,每一行都可以从上一行迁移而来,事实上不用真的循环把第一列全部设置为1,
// 只需把f[0][0]=1,即可完成递推关系建立。
// f[0][0] = 1;
for (int i = 1; i <= n; i++) {
int v;
scanf("%d", &v);
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];
}
}
printf("%d\n", f[n][m]);
return 0;
}
```
#### 2、一维
```c++
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m;
int f[N];
int main() {
freopen("QiaHao_01.in", "r", stdin);
scanf("%d %d", &n, &m);
f[0] = 1; //列设置为1
for (int i = 1; i <= n; i++) {
int v;
scanf("%d", &v);
for (int j = m; j >= v; j--) f[j] += f[j - v];
}
printf("%d\n", f[m]);
return 0;
}
```
### 二、完全背包
例子:给你一堆物品,每个物品有一定的体积,每个物品可以选无数多个,求 <font color='blue' size=4><b>总体积恰好是$m$</b></font>的 <font color='red' size=4><b>方案数</b></font>
输入
```c++
3 5
2 3 7
```
输出
```c++
1
```
#### 1、二维
```c++
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m;
int f[N][N];
int main() {
//文件输入
freopen("QiaHao_WQ.in", "r", stdin);
scanf("%d %d", &n, &m);
f[0][0] = 1;
for (int i = 1; i <= n; i++) {
int v;
scanf("%d", &v);
for (int j = 0; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= v) f[i][j] += f[i][j - v];
}
}
printf("%d\n", f[n][m]);
return 0;
}
```
#### 2、一维
```c++
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m;
int f[N];
int main() {
freopen("QiaHao_WQ.in", "r", stdin);
scanf("%d %d", &n, &m);
f[0] = 1;
for (int i = 1; i <= n; i++) {
int v;
scanf("%d", &v);
for (int j = v; j <= m; j++) f[j] += f[j - v];
}
printf("%d\n", f[m]);
return 0;
}
```