算法-背包问题
01背包问题
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); (j>=w[i])
一维化(由于递推关系i只和i-1 有关,可进行空间压缩,遍历j时需要逆序遍历)
for(int i=0;i<=n;i++){
for(int j=target;j>=w[i];j--){
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
}
完全背包问题
商品不限量
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i], dp[i-1][j-2w[i]] + 2v[i], ... dp[i-1][j-kw[i]] + kv[i]); (j>=kw[i])
由于
dp[i][j-w[i]] = max(dp[i-1][j-w[i[], dp[i-1][j-2w[i]] + v[i], dp[i-1][j-3w[i]] + 2v[i], ... dp[i-1][j-(k+1)w[i]] + kv[i]);
dp[i][j] = max(dp[i-1][j], dp[i][j-w[i]] + v[i]);
一维化(由于递推关系i只和i-1 有关,可进行空间压缩,遍历j时可以正序遍历)
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
多重背包问题 (完全背包问题可以转换为多重背包问题k=j/w[i])
商品限量k[i]个
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i], dp[i-1][j-2w[i]] + 2v[i], ... dp[i-1][j-kw[i]] + kv[i]); (k<k[i] && j>=kw[i])
for(int i=0;i<=n;i++){
for(int j=target;j>=w[i];j--){
for(int k=0;k <= k[i] && j >= kw[i];k++){
dp[j] = max(dp[j], dp[j-kw[i]] + kv[i]);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本