今天看到背包问题。特记录下整理下自己的理解。方便以后查阅自己算法的理解。
看背包问题,主要是它是用到动态规划,动态规划是能把问题划分为子问题。也就是状态转移方程。更多了动态规划,查看其他的博客或者文档。
问题描述:
一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i]
那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。这里装物品主要由三种装法:
1、0-1背包:每类物品最多只能装一次
2、多重背包:每类物品都有个数限制,第i类物品最多可以装num[i]次
3、完全背包:每类物品可以无限次装进包内
思考中,如果给你的是多个背包a,b,c,不固定容量,你怎么装才能最大化价值总和。思路是随即一个背包,然后根据上面的装法,计算这个背包的能装的最大值。装好后再选下一个背包,计算剩下的物品能装的最大值。直到装完所有背包为止。得到所有背包装的价值得总和。这个没有在代码中没有跑,如果是不同装包顺序下是否得到的最大价值都是一样的。
一、0—1背包
假设我们用dp[N][V]表示,N个物品,容量V的总价值。则dp[i][j]表示前i个物品在容量为j的情况下,背包保存的物品价值总和的最大值。最终dp[N][V]为我们所求。
我们考虑动态规划数据dp[i][j]的状态转移方程。有两种情况一种是背包不放第i个物品,一种是背包放第i个物品,计算两种情况哪一种总价值对大。得到最优解。 转移方程:dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i-1]] + value[i-1])