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