算法笔记(c++)--完全背包问题
算法笔记(c++)--完全背包和多重背包问题
完全背包
完全背包不同于01背包-完全背包里面的东西数量无限
假设现在有5种物品重量为5,4,3,2,1
价值为1,2,3,4,5
背包容量为10
#include <iostream>
#include<algorithm> using namespace std;
int main()
{
int total_weight = ;
int w[] = { ,,,,,};
int v[] = { ,,,,,};
int dp[] = { };
for (int i = ; i <= ; i++)
for (int j = w[i]; j <= ;j++)
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
cout << "总的价值为: " << dp[] << endl;
return ;
}
其他都和01背包一样,就是遍历j时候的初始化不一样。
这里的dp[j]还是表示前i件物品放入一个为j容量的背包获得的最大价值,每次更新必然保证是当前最优解。就像求最长递增子序列一样。都是把所有情况过一遍然后拿最大的结果。
不多讲直接推算几步就全懂了。
1)首先是当只有物品1号的时候,j初始化为1号物品的重量为5
dp[5]=max(dp[5],dp[5-5]+1]=1
dp[6]到dp[9]都是1,dp[10]=2
2)然后现在是有物品1号和2号,j初始化为2号物品重量4
dp[4]=max(dp[4],dp[4-4]+2)=2
dp[5]=max(dp[5],dp[5-4]+2)=2
dp[..8]=max(dp[8],dp[8-4]+2)=4
其实到这里也差不多了,下面都是一样的。
我们要决定是不是要放这个物品,就从这个物品的大小出发遍历背包容量,然后每次遍历都对比下假如现在腾出这个物品的空间并且放进去比原来的价值还大的话,就放进去。
区别------------01背包和完全背包
01背包遍历是反向的,这样更新就不会影响前面的。
而完全背包正向遍历,会改变前面的所以也就可出现多次存放的了。
多重背包
多重背包再加点限制,数量有限制。
数据如下:
| 数量 | 重量 | 价值 |
| 0 | 0 | 0 |
| 1 | 5 | 1 |
| 2 | 4 | 2 |
| 1 | 3 | 3 |
| 2 | 2 | 4 |
| 1 | 1 | 5 |
同样设背包为10大小
代码如下:
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int total_weight = ;
int w[] = { ,,,,, };
int v[] = { ,,,,, };
int cot[] = { ,,,,, };
int dp[] = { };
for (int i = ; i <= ; i++)
for (int k = ; k <= cot[i];k++)
for (int j = ; j >= w[i]; j--)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
cout << "总的价值为: " << dp[] << endl;
return ;
}
这次不一步步来了,懂01就可以了。
因为每次01都是放一个而完全背包是放多个,我们也不知道完全 背包放了几个。所以多重背包算是01背包的变种。
既然我们每次遍历都是判断放不放这一个物品,那我们干脆就有几个就遍历几遍。再遍历外面再加一个for就好了
很好理解。
算法笔记(c++)--完全背包问题的更多相关文章
- 算法笔记(c++)--01背包问题
算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...
- 算法笔记(c++)--关于01背包的滚动数组
算法笔记(c++)--关于01背包的滚动数组 关于01背包问题:基本方法我这篇写过了. https://www.cnblogs.com/DJC-BLOG/p/9416799.html 但是这里数组是N ...
- 算法笔记_041:寻找和为定值的多个数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...
- 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)
Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...
- 算法笔记--数位dp
算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...
- 算法笔记--lca倍增算法
算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...
- 算法笔记--STL中的各种遍历及查找(待增)
算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...
- 算法笔记--priority_queue
算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...
- 算法笔记--sg函数详解及其模板
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...
随机推荐
- centos7 安装拼音输入法
依次选择Applications->System Tools->setting->Regiin&Language,添加Chinese(Intelligent Pinyin) ...
- Navicat Premium 12 激活
链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...
- Servlet基础知识总结
Servlet是JavaWeb应用开发的核心组件.Servlet运行在Servlet容器中(例如最常用的Tomcat),它可以为各种客户请求提供相应服务.Servlet可以轻松完成以下任务: 动态生成 ...
- 在vscode中使用webpack中安装的echarts文件失败,dom获取class名,图表不显示
所有的东西都是新学的,所以遇到了很多问题: (1)首先,在电脑上已经安装了node的情况下, 在npm中安装echarts:npm install echarts --save mac系统在最前面加上 ...
- 话说文件系统——aufs源码分析(三)
1. linux中设备驱动的入口都是:module_init(xxx_init);里面注册的函数,对于文件系统来说也是一样的,对于aufs来说,就是aufs_init,具体如下 //用于描述aufs文 ...
- BurpSuite—-Scanner模块(漏洞扫描)
一.简介 Burp Scanner 是一个进行自动发现 web 应用程序的安全漏洞的工具.它是为渗透测试人员设计的,并且它和你现有的手动执行进行的 web 应用程序半自动渗透测试的技术方法很相似. 使 ...
- angular5学习笔记 路由通信
首先在路由字典中,接收值的组件中加上:/:id 在发送值的组件中,发送值的方式有几种. 第一种:<a routerLink="/detail/1">新闻详情1</ ...
- 20155236 《Java程序设计》实验四(Android程序设计)实验报告
20155236 <Java程序设计>实验四(Android程序设计)实验报告 一.实验内容及步骤 第24章:初识Android 任务一:完成Hello World, 要求修改res目录中 ...
- Makefile与Myod
Makefile的引入 课堂测试总结 初识Makefile target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是Obje ...
- 20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod
20155339 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile以及myod 测试1-vi 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 用Vi ...