『算法-ACM竞赛-动态规划』DP背包(一)
『算法-ACM 竞赛-动态规划』DP 背包(一)
01 背包
1 |
|
初始化细节:装满 dp[0]=0;其余赋值-INF;不装满全初始化为 0;
完全背包
for(int i=0;i<n;i++) //遍历每一类物品
for(int j=wei[i];j<=v;j++)//遍历容量,此时代表第一类物品选了几件。与0/1区别正序遍历
dp[j]=max(dp[j-wei[i]]+val[i],dp[j]);
多重背包
1 |
|
二进制优化
优化原因:
多重背包转换成 01 背包问题就是多了个初始化,把它的件数 C 用
分解成若干个件数的集合,这里面数字可以组合成任意小于等于 C
的件数,而且不会重复,之所以叫二进制分解,是因为这样分解可
以用数字的二进制形式来解释
比如:7 的二进制 7 = 111 它可以分解成 001 010 100 这三个数可以
组合成任意小于等于 7 的数,而且每种组合都会得到不同的数
15 = 1111 可分解成 0001 0010 0100 1000 四个数字
如果 13 = 1101 则分解为 0001 0010 0100 0110 前三个数字可以组合成
7 以内任意一个数,加上 0110 = 6 可以组合成任意一个大于 6 小于 13
的数,虽然有重复但总是能把 13 以内所有的数都考虑到了,基于这种
思想去把多件物品转换为,多种一件物品,就可用 01 背包求解了。
1 |
|
好像单调队列也能优化,多重背包;
下一期整理
『算法-ACM竞赛-动态规划』DP背包(一)
https://chiamzhang.github.io/2024/06/29/『算法-ACM竞赛-动态规划』DP背包(一)/