01背包

for(int i=0;i<n;i++) //遍历每一件物品
for(int j=v;j>=wei[i];j--)//遍历背包容量,表示在上一层的基础上,容量为J时,第i件物品装或不装的最优解;
dp[j]=max(dp[j-wei[i]]+val[i],dp[j]);

初始化细节:装满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]);

多重背包

for(int i=0;i<n;i++)  //遍历每一个物品
for(int j=0;j<=num[i];j++) //遍历物品的数量
for(int k=m;k>=weight[i];k--) //当做01背包来处理
{ //取01背包情况的dp[k]和dp[k-weight[i]]+value[i]的最大值
dp[k]=max( dp[k],dp[k-weight[i]]+value[i] );
}

二进制优化

优化原因:

多重背包转换成 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 背包求解了。

for(int i=0;i<n;i++)
{
cin>>w[i]>>v[i]>>c[i];//对每一种类的c[i]件物品进行二进制分解
for(int j=1;j<=c[i];j<<=1){ //右移=*2
value[cnt]=j*v[i];
weight[cnt]=j*w[i];
cnt++;
c[i]-=j;
}
if(c[i]>0){
alue[cnt]=c[i]*v[i];
weight[cnt]=c[i]*w[i];
cnt++;
}
}
01背包求解.....

好像单调队列也能优化,多重背包;

下一期整理

DP背包(一)的更多相关文章

  1. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  2. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  3. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  4. HDU 5234 DP背包

    题意:给一个n*m的矩阵,每个点是一个蛋糕的的重量,然后小明只能向右,向下走,求在不超过K千克的情况下,小明最终能吃得最大重量的蛋糕. 思路:类似背包DP: 状态转移方程:dp[i][j][k]--- ...

  5. HDU4276 The Ghost Blows Light(树形DP+背包)

    题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...

  6. HDU 4003 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...

  7. ZOJ 3626(树形DP+背包+边cost)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3626 题目大意:树中取点.每过一条边有一定cost,且最后要回 ...

  8. XCOJ 1102 (树形DP+背包)

    题目链接: http://xcacm.hfut.edu.cn/oj/problem.php?id=1102 题目大意:树上取点.父亲出现了,其儿子包括孙子...都不能出现.给定预算,问最大值. 解题思 ...

  9. HDU 1561 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...

  10. POJ 1155 (树形DP+背包+优化)

    题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...

随机推荐

  1. grub2手动引导linux

    仅需要三个命令 1.set root=(hd*,gpt*) hd*为系统所在磁盘,从0开始: gpt为磁盘分区表格式,*为第几分区,mbr分区表为msdos*: 2.linux /boot/vmlin ...

  2. spark foreachPartition foreach

    1.foreach val list = new ArrayBuffer() myRdd.foreach(record => { list += record }) 2.foreachParti ...

  3. tf.train.GradientDescentOptimizer 优化器

    tf.train.GradientDescentOptimizer(learning_rate, use_locking=False,name='GradientDescent') 参数: learn ...

  4. tf.nn.dropout 激活函数

    tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None) 参数: x:一个浮点型Tensor. keep_prob:一个标量Ten ...

  5. CORS漏洞的学习与分析

    同源策略 同源策略(Same origin policy)是一种约定,一种非常重要的安全措施,也是最基本的安全功能,它禁止了来自不同源的脚本对当前页面的读取或修改,从而限制了跨域访问甚至修改资源,防止 ...

  6. python填写问卷星,疫情上报

    #!!!注意:修改main里的url为真实的url,按需修改 50行 set_data中的submitdata # 61行 ip 修改为 真ip # submittype可能有错误,在151行 # 提 ...

  7. 从3dMax导出供threeJS使用的带动作模型与加载

    评论区发现的建议,最近没空测试,先贴这 还有好多人说找不到插件的 https://pan.baidu.com/s/1Q5g0... 密码:b43e . 应该是他们现在只是维护blender,只有这个的 ...

  8. L23模型微调fine tuning

    resnet185352 链接:https://pan.baidu.com/s/1EZs9XVUjUf1MzaKYbJlcSA 提取码:axd1 9.2 微调 在前面的一些章节中,我们介绍了如何在只有 ...

  9. 排序算法代码实现-Java

    前言 为了准备面试,从2月开始将排序算法认认真真得刷了一遍,通过看书看视频,实践打代码,还有一部分的leetcode题,自己感觉也有点进步,将笔记记录总结发出来. 冒泡排序 该排序就是一种像泡泡浮到水 ...

  10. 4. js

    1.) ~   操作符 console.log(~-2)  // 1 console.log(~-1)  // 0 console.log(~0)  // -1 console.log(~1)  // ...