算法-背包问题

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-2
w[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 >= k
w[i];k++){
dp[j] = max(dp[j], dp[j-kw[i]] + kv[i]);
}
}
}

posted @   sahara-随笔  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示