代码随想录算法训练营第四十二天|01背包问题、416. 分割等和

2023-09-18  本文已影响0人  eagleX

01背包问题

分为二维数组和一维数组,一维有点绕

416. 分割等和子集

动规五部曲:

确定dp数组以及下标的含义

01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。

dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]

如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了

确定递推公式

01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp数组如何初始化

dp[0]一定是0

确定遍历顺序

使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历

// 开始 01背包for(inti=0;i<nums.size();i++){for(intj=target;j>=nums[i];j--){// 每一个元素一定是不可重复放入,所以从大到小遍历dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);}}

上一篇 下一篇

猜你喜欢

热点阅读