• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

sm1le

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

动态规划

动规五部曲:
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]];,并且需要先遍历背包再遍历物品

posted on 2022-05-01 11:47  sm1le  阅读(39)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3