一共四种背包模型:
1、01背包
题面:
有n个物品,背包容量为m,第i件物品价格为c[i],价值是v[i]
每个物品只能那一次
求哪些物品放入背包能使得获得价值最大
思路:
每件物品可以选择放或不放
状态转移:每次从i,j的正上方和左上方转移过来
不放:dp[i][j] = dp[i-1][j];
放:dp[i][j] = dp[i-1][j-c[i]] + v[i];
最终的状态方程为:
2、完全背包
题意:
有n个物品,背包容量为m,第i件物品价格为c[i],价值是v[i]
每个物品可以拿无数次
求哪些物品放入背包能使得获得价值最大
思路:
借鉴01背包:每个物品可以放或不放
状态转移:
3、多重背包
题意:
有n个物品,背包容量为m,第i件物品价格为c[i],价值是v[i],每件物品可以拿p[i]次
0 <= p[i] <= x
当p[i] = 0 时,可以取无限次
求哪些物品放入背包能使得获得价值最大
思路:
当p[i] = 0,可以当作完全背包来处理。
当p[i] = 1,可以当作01背包来处理。
当p[i] > 1,转化为多重背包。
状态转移:
二进制优化:
拆成:1,2,4,8,16......,和剩下的
4、分组背包
题意:
有n个物品,有T组,每个物品属于不同的组,背包容量为m,第i件物品价格为c[i],价值是v[i],每件物品属于t[i]种类别
每组只能拿一个物品。
求哪些物品放入背包能使得获得价值最大
思路:
先将不同的物品分类
对于每组物品,用01背包求能拿到的最大价值。
状态转移: