动态规划
动规五部曲:
1.确定dp下标以及dp数组的含义
2.确定递推关系
3.确定初始化参数
4.确定遍历顺序
5.举例推导dp数组
一.01背包问题
二维dp:
for(int i = 0; i < nums.size(); i++)
for(int j = nums[i]; j <= bagsize; j++)
dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]]+value[i]);
一维dp:内层从大到小遍历
for(int i = 0; i < nums.size(); i++)
for(int j = bagsize; j >= nums[i]; j--)
dp[j] = max(dp[j], dp[j-nums[i]]+value[i]);
二.完全背包问题
内层从小到大遍历
for(int i = 0; i < nums.size(); i++)
for(int j = nums[i]; j <= bagsize; j++)
dp[i][j] = max(dp[j], dp[j-nums[i]]+value[i]);
tips:
1.组合问题:递推公式为dp[j] += dp[j-nums[i]];
2.排列问题:递推公式为dp[j] += dp[j-nums[i]];,并且需要先遍历背包再遍历物品
浙公网安备 33010602011771号