01背包问题思路由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“完全背包问题算法”。
0-1背包问题通用算法:(算是非贪心算法吧,当然也用到贪心思想,每次取最大值)
1.假设:
n种物品,种类1,2,…,n;每种物品质量m[0],m[1],m[2],…,m[n-1];每种物品价值v[0],v[1],…,v[n-1];背包能承受的总质量为mk,设数组dp[1],dp[2],…,dp[mk-1],dp[mk](注意,dp不包含0包含mk)表示当包内放了1,2,…,mk-1,mk质量的东西时能达到的最大价值。
2.问题:
如何安排放置在背包里的物品使得背包内物品总价值能达到最大?(假设每种类型物品个数是无限的)
3.算法:
第一步:将n种物品按照质量从小到大排序,相应的价值也要跟着质量数组m的变化而变化,保持对应关系。
第二步:按照如下算法进行
for(i = 0;i
{
for(j = m[i];j
}
最终执行完毕后,dp[mk]值即为包内放置mk质量的东西时能达到的最大价值的值!
4.特例:
当题目只给你质量而没有价值时,不放设价值和质量取相同值,转化为特殊的0-1背包问题,如上解问题。当题目只给你价值而没有质量时也不妨设质量和价值取相同值,同样用上述方法解决问题。
5.思路: 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。可以压缩空间,f[v]=max{f[v],f[v-c[i]]+w[i]}