一、 01背包
-
01背包含义很简单,就是放进包里和不放进包里的区别。
-
状态转移方程:
(1) 一维:f[v] = max(f[v-c[i]] + w[i], f[v]);
(2) 二维:f[v][n] = max(f[v-c[i]][n-1] + w[i], f[v][n-1]); -
取值:
(1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
(2)c[i]代表第i个骨头的大小。(输入,取值任意数)
(3)w[i]代表第i个骨头的价值。(输入,取值任意数)
(4)i代表1-n个骨头(循环范围1-n)
(5)j代表第j个骨头占空(循环范围c[i]-v)
二、 完全背包
-
状态转移方程:
(1) 一维:f[v] = max(f[v-c[i]] + w[i], f[v]);
(2) 二维:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]); -
取值:
(1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
(2)c[i]代表第i个骨头的大小。(输入,取值任意数)
(3)w[i]代表第i个骨头的价值。(输入,取值任意数)
(4)i代表1-n种骨头(循环范围1-n)
(5)j代表第j种的一个骨头占空(循环范围c[i]-v)
三、 多重背包
-
在01背包基础上延伸出来。
-
状态转移方程:
(1)一维:f[v] = max(f[v-k*c[i]] + k*w[i], f[v]);
(2) 二维:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]); -
取值:
(1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
(2)c[i]代表第i个骨头的大小。(输入,取值任意数)
(3)w[i]代表第i个骨头的价值。(输入,取值任意数)
(4)p[i]代表每一种骨头有多少个。
(5)i代表1-n个骨头(循环范围1-n)
(6)j代表第j种骨头(循环范围c[i]-v)
(7)k代表第j种骨头中的1-k个(循环范围1-p[i]和v-k*c[i] >= 0)
(8)注意:第三个循环条件两个,1-p[i]和j-k*c[i] >= 0;
四、 混合背包
-
一个大for包括if判断多重背包还是完全背包。
-
状态转移方程:
(1)一维:
完全背包:f[v] = max(f[v-c[i]] + w[i], f[v]);
多重背包:f[v] = max(f[v-kc[i]] + kw[i], f[v]);
(2)二维:
完全背包:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]);
多重背包:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]); -
取值:
见完全背包以及多重背包的取值。