【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 ...
随机推荐
- dubbo服务调试管理实用命令
公司如果分项目组开发的,各个项目组调用各项目组的接口,有时候需要在联调环境调试对方的接口,可以直接telnet到dubbo的服务通过命令查看已经布的接口和方法,并能直接invoke具体的方法,我们可以 ...
- VBA-数据库操作
基本概念 1 怎么样才能操作数据库?使用ADO建立和数据库的连接,然后用ADO对象和sql语言对数据库进行操作. 2 SQL是什么?SQL(Structured Query Language)是一种查 ...
- Solr是什么?
么是Solr?Solr是什么? 答:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口. Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服 ...
- 重学JavaScript - 映射与集合
作者:狐狸家的鱼 GitHub:surRimn 整理自MDN文档 带键的集合 映射 Map对象 一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返 ...
- Laravel框架中如何使用事件记录SQL查询到日志
在本文中,我们将说一下如何处理Laravel中的查询日志记录.如果你非常熟悉Laravel框架,Laravel可以选择将所有在当前请求中运行的查询记录在内存中. 查询记录 如果,你想要将日志文件保存在 ...
- iview select下拉框的蜜汁小坑
前言 最近使用iview的select下拉选择器,遇到一个很神奇的问题:选中下拉框里面的一个值,但是再去点下拉框的时候就只剩刚才选中的数据了.感觉应该是插件把刚才选中的数据当做的搜索条件,所以需要做的 ...
- activemq消息中间件的依赖
<dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artif ...
- Steup Factory 操作注册表
//判断注册表是否存在,不存在就创建 result = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\MyTestApp" ...
- 文本处理工具——sed进阶
一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...
- PHP filter_id() 函数
定义和用法 filter_id() 函数返回指定过滤器的 ID 号. 如果成功则返回过滤器的 ID 号,如果过滤器不存在则返回 NULL. 语法 filter_id(filter_name) 参数 描 ...