第一次写文章,轻喷,如有不足,欢迎指出
背包种类:
1,01背包
2,完全背包
3,多重背包
4,分组背包
0,解dp背包题的大体思路
确定状态——转移方程式——初始化
1,01背包
给定n个物品,重量分别为w1、w2、w3...价值分别为p1、p2、p3...装入最大载重为m的背包,
要求一种物品只能装入一次,使装入的物品价值最大并且不超过背包的载重。
1)、确定状态
i/j | 0 | 1 | 2 | 3 |
0 | ||||
1 | ||||
2 | ||||
3 |
表格的i表示前i个物品,j表示为背包最大载重为j,所以说表格中的元素为前i个物品最大载重为j时的最大价值。
然后状态有两种,第1种为不选这个物品时的价值,第2种为选这种物品价值,再把两者比较大小就行。
2)、转移方程式
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);//w为物品的重量,p为物品的价值
f[i-1][j]表示不选时的价值,同时也要继承前i-1物品的最大价值,f[i-1][j-w]+p表示选了这个物品,因为选了这个物品,所以要减去这个物品个重量(j-w),这样才装得下,然后加上物品的价值p就行。
3)、初始化
前0个物品的最大价值为0。
n物品数量
m背包最大载重
w每件物品的重量,p每件物品的价值
--------------------01背包二维数组---------------------------
0-1背包-二维数组
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
f[