【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)【还差一道题】
任务说明:这是最基础的动态规划。不过如果是第一次接触会有些难以理解。加油闯过这个坎。
01背包二维数组优化成滚动数组的时候有坑有坑有坑!!!必须要downto,downto,downto
情景和代码见装箱问题。
P1060 开心的金明
小明的妈妈给小明N元钱,小明想买m件物品,每个物品价值为 价格*重要度,求出不超过N元钱的情况下,最多能买多少价值的物品,输出价值。
解法:直接的01背包问题,我居然还去看了书。。递推方程一次写不出来。方程需要记忆。
dp[i][j]表示前i件物品总价格不超过j元的最大总价值。

需要学习下怎么在博客园输入latex公式orz。。。
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring> using namespace std; int main() {
int n, m;
cin >> n >> m;
int w[m][];
for (int i = ; i < m; ++i) {
cin >> w[i][] >> w[i][];
w[i][] *= w[i][];
} int dp[m+][n+];
memset(dp, , sizeof(dp)); for (int i = ; i <= m; ++i) {
for (int j = ; j <= n; ++j) {
if (w[i-][] > j) { dp[i][j] = dp[i-][j]; }
else {
dp[i][j] = max(dp[i-][j], dp[i-][j-w[i-][]] + w[i-][]);
}
}
}
cout << dp[m][n] << endl; return ;
}
P1164 小A点菜
有M元, N种菜(每个菜只有一份),每种菜有价格,求能把M元全花完的方案数。
解答:一开始全WA....哭死..其实还是经典的01背包问题。
一维的转移方程为: dp[j] += dp[j-price[i-1]]; 初始化条件为 dp[0] = 1, dp[1..m] = 0。 (因为需要花0元只有一种方案,就是啥也不买)
#include <bits/stdc++.h>
using namespace std; int main() {
int n, m;
cin >> n >> m;
int dp[m+] = {};
dp[] = ;
int price[n];
for (int i = ; i < n; ++i) {
cin >> price[i];
}
for(int i = ; i <= n; ++i) {
for (int j = m; j >= ; --j) {
if (j >= price[i-]) {
dp[j] = dp[j] + dp[j-price[i-]];
}
}
}
cout << dp[m] << endl;
return ;
}
金明的预算方案
P1048 采药
就是01背包,裸的,直接写了,方程同P1060
提交一次AC
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; int main() {
int T, M;
cin >> T >> M;
int w[M][];
for (int i = ; i < M; ++i) {
cin >> w[i][] >> w[i][];
}
int dp[M+][T+];
memset(dp, , sizeof(dp)); for (int i = ; i <= M; ++i) {
for (int j = ; j <= T; ++j) {
if (j < w[i-][]) { dp[i][j] = dp[i-][j]; }
else {
dp[i][j] = max(dp[i-][j], dp[i-][j-w[i-][]] + w[i-][]);
}
}
}
cout << dp[M][T] << endl;
return ;
}
P1049 装箱问题
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
就是求怎么样是用的空间最大。裸的01背包。优化成滚动数组的时候被坑了。
//写成滚动数组的时候,max(dp[j], dp[j-w[i-1]]+w[i-1]);如果是从左到右,那么dp[j-w[i-1]]是个已经被更新过的值。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> using namespace std; int main() {
int c, n;
cin >> c >> n;
int w[n+];
for (int i = ; i < n; ++i) {
cin >> w[i];
}
int dp[c+] = {};
for (int i = ; i <= n; ++i) {
//滚动数组这么写的时候,max(dp[j], dp[j-w[i-1]]+w[i-1]);如果是从左到右,那么dp[j-w[i-1]]是个已经被更新过的值。。
//for (int j = 1; j <= c; ++j) {
for (int j = c; j >= ; --j) {
if (j < w[i-]) { dp[j] = dp[j]; }
else {
dp[j] = max(dp[j], dp[j-w[i-]]+w[i-]);
}
}
}
cout << c - dp[c] << endl;
return ;
}
P1616 疯狂的采药
采药问题的升级版,不限制每种物品的个数。完全背包问题(每个物品无穷个)。
完全背包的解法就是01背包的downto的写法改成正着写...不过这不是重点。重点是理解为啥需要正着写。
提交一次AC了

#include <bits/stdc++.h>
using namespace std;
int main() {
int T, M;
cin >> T >> M;
int w[M][];
for (int i = ; i < M; ++i) {
cin >> w[i][] >> w[i][];
}
int dp[T+] = {};
for (int i = ; i <= M; ++i) {
for (int j = ; j <= T; ++j) {
if (j < w[i-][]) { continue; }
else {
dp[j] = max(dp[j], dp[j-w[i-][]]+w[i-][]);
}
}
}
cout << dp[T] << endl;
return ;
}
【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)【还差一道题】的更多相关文章
- 【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】
任务说明:由一个根节点分叉,越分越多,就成了树.树可以表示数据之间的从属关系 P1087 FBI树 给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历. ...
- 【Luogu】【关卡2-13】线性数据结构(2017年10月)【还差一道题】
任务说明:数组,链表,队列,栈,都是线性结构.巧用这些结构可以做出不少方便的事情. P1996 约瑟夫问题 n个人,排成环形,喊到m的人出列,输出出列顺序. 咳咳,这个题目不好写,尽管简单就是模拟题. ...
- 【Luogu】【关卡2-10】分治算法(2017年10月)
任务说明:将大问题拆分为小问题,分而治之,各个击破,然后在合并回来. 取余运算||快速幂 幂次方 逆序对 南蛮图腾
- 【Luogu】【关卡2-8】广度优先搜索(2017年10月)
任务说明:广度优先搜索可以用来找有关“最短步数”的问题.恩,也可以用来“地毯式搜索”.
- 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】
任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...
- 【Luogu】【关卡2-5】字符串处理(2017年10月)
任务说明:这里的字符串处理还会变得更加的有意思,难度也更大.需要好好地思考一下.
- 【Luogu】【关卡2-4】排序Ex(2017年10月)
任务说明:这里的排序就更上一层了.不仅融合了别的算法与技巧,排序本身也有各种花招.
- 【Luogu】【关卡2-2】交叉模拟(2017年10月)
任务说明:这里也是模拟,但是会混有些别的部分.思维难度不大,但是编写起来会有些难度.
- 欢迎来怼-Alpha周(2017年10月19)贡献分配规则和分配结果
.从alpha周(2017年10月19日开始的2周)开始,提高贡献分比重. 贡献分 : 团队分 = 1 : 5 教师会在核算每位同学总分时按比例乘以系数. 每位同学带入团队贡献分10分,如果团队一共7 ...
- 2017年10月31日结束Outlook 2007与Office 365的连接
2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...
随机推荐
- C++中static的作用
tatic关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用st ...
- Linux 定时任务 Crontab 命令详解
linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...
- 微信浏览器 video - android适配
阶段一: 直接裸用 video 标签, 安卓 - 会重新弹一个播放层, 和之前video的父盒子错位, 要多丑有多丑, 体验要多烂有多烂. 阶段二: video添加以下属性, 安卓可实现内联播放, 但 ...
- 在windows下使用secure crt传文件到linux的主目录下
SECURT CRT上传文件 使用secure crt连接到Linux上 通过alt+p打开sftp服务 使用put D:\视觉\代码\ch.10.zip 即可传输完成 进入linux直接在主目录下可 ...
- STM点滴一
就就是你用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险.也就不需要关闭中断. This way, there is no risk that an IRQ occurs between ...
- tp框架数据查询,增删改
select()是数据模型的一个指定方法,可以获得数据表的数据信息 返回一个二维数组信息,当前数据表的全部数据信息 $obj = D(); 创建对象 $obj -> select(); 查询 ...
- bzoj 2364
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2346 比较裸的最短路(' ' ) 水题又多了一道 #include <iost ...
- QByteArray和十六进制的QString(char*)相互转换
#include <QCoreApplication> #include <QDebug> #include <QDataStream> QByteArray He ...
- K-th Closest Distance
题目链接 题意:n个数,q次查询,查询[l , r] 内, | a[i] - p | 第k大的数 思路:主席树维护下权值大小,二分答案,查询区间[p - mid, p + mid] 的个数 #incl ...
- MySQL 下载,安装,配置windows 服务
本次使用的是压缩包的方式是可以纯手动自己折腾各种配置... ok,闲话少叙,我们准备发车... 一.先要去mysql官网去下载压缩包咯 ①下载地址:https://dev.mysql.com/down ...