POJ - 3624 (01背包问题)(动态规划-滚动数组)
题意:
往手镯上镶嵌宝石,手镯总重量有上限,要求手镯的总价值最大。
本质就是一个01背包问题。
解题思路:
下面开始分析01背包问题。
动态规划问题主要是找到子问题,即一旦确定了第i个状态,就可以直接推出第i+1个状态。(有后效性)
以题目给出的数据举例:
4 6 n m ① 1 4 w[i] v[i] ② 2 6 ③ 3 12 ④ 2 7
设F[j]为背包剩余容积为j时背包所能达到的最大价值。(j <= m)
取①号物体时,如果j < 1,则F[0] = 0,如果j >= 1时,F[1]=F[2]=...=F[6]=4;
取②号物体时,如果j < 2,则F[1]保持不变,仍为4;
如果j >= 2,则可以选择取或者不取②号物体,因此F[j] = max(F[j],F[ j-w[i] ]+v[i]);(如下所示)
取:F[2] = F[ j-w[i] ]+v[i] = F[0]+v[2]=0+6=6;
F[3] = F[ j-w[i] ]+v[i] = F[1]+v[2]=4+6=10;
F[4] = F[ j-w[i] ]+v[i] = F[2]+v[2]=4+6=10;...F[5]=F[6]=10;
不取:F[1]=F[2]=...=F[6]=4;
因此F[j]=max(取,不取)=max(F[j],F[ j-w[i] ]+v[i]);
取③号物体...取④号物体,依次类推
下面是代码实现:
#include <cstdio>
#include <algorithm>using namespace std;int w[3410],v[3410]; //记录各个物体的重量和价值
int f[12900]; //记录当背包剩余重量为j时的背包最大价值int main()
{int n,m;//n是个数,m是最大重量scanf("%d%d",&n,&m);for(int i = 0;i < n;i++){scanf("%d%d",&w[i],&v[i]); } for(int i = 0;i < n;i++){for(int j = m;j >= 1;j--){if(j >= w[i]){f[j] = max(f[j],f[j-w[i]]+v[i]);//取还是不取 } }}sort(f,f+m+1);printf("%d\n",f[m]);return 0;
}
POJ - 3624 (01背包问题)(动态规划-滚动数组)相关推荐
- 代码随想录算法训练营day41 | 动态规划 01背包问题基础 01背包问题之滚动数组
day41 01背包问题基础 问题描述 举个栗子 二维dp数组01背包 1.确定dp数组以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 01背包问题之 ...
- 【动态规划】01背包问题(滚动数组 + 手画图解)
01背包除了可以用形象的二维动态数组表示外,还可以使用空间复杂度更低的一维滚动数组. 目录 文章目录 前言 一.滚动数组的基本理解 二.确定dp及其下标含义 三.确定递推公式 四.确定初始化 五.确定 ...
- 01背包问题动态规划(二维数组)
01背包问题动态规划(二维数组) 问题描述 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...
- 0-1背包问题的一维数组优化解析
[问题描述] 常见的0-1背包问题,多使用二维数组来实现.二维数组实现时,常用的状态转移方程为: c[i][j]=c[i-1][j], j<vol[i] c[i][j]=max(c[i-1][j ...
- 背包问题动态规划matlab,01背包问题动态规划详解
计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...
- 01背包问题 动态规划 java实现 简单通俗易懂
** 01背包问题 动态规划 ** 1.动态规划 什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案 ...
- 守望者的逃离 动态规划+滚动数组
题目: 恶魔猎手尤迪安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去 ...
- 动态规划/滚动数组/通项公式——爬楼梯
一.题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 二.思路解析 1.迭代 第n个台阶只能从第n-1或者n-2个上来.到第 ...
- 0-1背包问题动态规划模型的Python解法
0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...
- 【LeetCode笔记】494. 目标和(Java、动态规划、背包问题、滚动数组)
文章目录 题目描述 思路 && 代码 1. 动态规划 O(n2n^2n2).O(n2n^2n2)(最方便理解,初版) 2. 转换成 01 背包问题 O(n2n^2n2).O(nnn) ...
最新文章
- 漫画:臭长臭长的高频贪心面试题
- 8个可以提高数据科学工作效率、节省宝贵时间的Python库
- BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)
- 下面由我来给大家表演个绝活
- eclipse 输入卡顿_7个小技巧,解决eclipse卡顿问题
- HTTP header location 重定向 URL
- excel和mysql php_php将mysql数据库和Excel相互导入和导出的方法
- 开启弹窗_烦人的电脑弹窗怎样关闭?4种方法还你干净桌面
- 哈里王子启动可持续旅行倡议 携程作为创始成员入选
- 数据:BTC全网算力为134.40 EH/s,新增地址数54.03万
- Don't Panic! KRACK 没你想象的那么糟
- 汇川,H3U,plc程序模板和触摸屏程序模板,三个步进和三个伺服,三个伺服用的是canlink总线,适用于运动轴控制
- turtle库绘图:绘制QQ所有表情
- 敏捷开发框架—Scrum
- 五分钟内用Python实现GitHook
- 人工智能是否将拥有人类意识?
- gt-itm模型生成拓扑结构
- HTML简约导航源码
- zed驱动的安装 及 遇到问题 及 ros标定
- 融云 SDK 集成详解 – Android Studio
热门文章
- Eclipse手动添加dtd文件使xml能自动提示
- php cookbook怎么样,《PHP Cookbook》学习笔记(三)
- 细节模拟题:素数回文
- atol、atoll、atof函数
- go插件 vscode 报错_win10环境下配置golang+vscode【解决install failed情况】
- c语言递归1到10联程,为什么这个递归能输出1到10
- linux下回收站在哪个文件夹,linux回收站在哪里
- 荒野大镖客fc java_FC荒野大镖客无敌版
- python 根据关键字 切割pdf_用python拆分pdf
- swagger 上传文件 参数_跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义...