背包问题啊

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

01背包 有n中物品每种只要一个

完全背包是有无限个

多重背包是每种物品的个数都不相同

dp[i][j]

 下标为0-i的物品放进容量为j的背包里

不放物品i dp[i-1][j]

放物品i dp[i-1][j-weight[i]]+values[i]

dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])

初始化工作:

对于二维数组实现的01背包两个for循环是可以颠倒的  

背包问题啊_第1张图片

因为只要保证能推到过来就行 

一维的dp数组  把上一层数据拷贝下来

dp[j] 容量为j的背包所能装的最大价值是dp[j]

dp[j]=max(dp[j],dp[j-weight[i]]+value[j])

初始化 

dp[0]=0;

都初始化成0

遍历顺序  一维的只能这样

for(int i=0;i<物品数量;i++){//物品

   for(int j=bagweight;j>=weight[i];j--){//背包  倒叙遍历  二维是不用倒叙 的而且背包和物品的顺序是随便的 

   倒叙遍历是为了保证每个物品只添加一次

}

如果背包有几个那么就几层for循环

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求装满背包有几种方法的情况下,递推公式一般为:dp[j]+=dp[j-nums[i]]

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

你可能感兴趣的:(算法,数据结构)