任务说明:这是最基础的动态规划。不过如果是第一次接触会有些难以理解。加油闯过这个坎。

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月)【还差一道题】的更多相关文章

  1. 【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】

    任务说明:由一个根节点分叉,越分越多,就成了树.树可以表示数据之间的从属关系 P1087 FBI树 给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历. ...

  2. 【Luogu】【关卡2-13】线性数据结构(2017年10月)【还差一道题】

    任务说明:数组,链表,队列,栈,都是线性结构.巧用这些结构可以做出不少方便的事情. P1996 约瑟夫问题 n个人,排成环形,喊到m的人出列,输出出列顺序. 咳咳,这个题目不好写,尽管简单就是模拟题. ...

  3. 【Luogu】【关卡2-10】分治算法(2017年10月)

    任务说明:将大问题拆分为小问题,分而治之,各个击破,然后在合并回来. 取余运算||快速幂 幂次方 逆序对 南蛮图腾

  4. 【Luogu】【关卡2-8】广度优先搜索(2017年10月)

    任务说明:广度优先搜索可以用来找有关“最短步数”的问题.恩,也可以用来“地毯式搜索”.

  5. 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】

    任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...

  6. 【Luogu】【关卡2-5】字符串处理(2017年10月)

    任务说明:这里的字符串处理还会变得更加的有意思,难度也更大.需要好好地思考一下.

  7. 【Luogu】【关卡2-4】排序Ex(2017年10月)

    任务说明:这里的排序就更上一层了.不仅融合了别的算法与技巧,排序本身也有各种花招.

  8. 【Luogu】【关卡2-2】交叉模拟(2017年10月)

    任务说明:这里也是模拟,但是会混有些别的部分.思维难度不大,但是编写起来会有些难度.

  9. 欢迎来怼-Alpha周(2017年10月19)贡献分配规则和分配结果

    .从alpha周(2017年10月19日开始的2周)开始,提高贡献分比重. 贡献分 : 团队分 = 1 : 5 教师会在核算每位同学总分时按比例乘以系数. 每位同学带入团队贡献分10分,如果团队一共7 ...

  10. 2017年10月31日结束Outlook 2007与Office 365的连接

    2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...

随机推荐

  1. yum 仓库搭建与源码包安装实战

    目录 一.yum 仓库自建示例: 二.源码包安装实践 基础环境 服务端配置 下载及安装fpm软件 客户端: 一.yum 仓库自建示例: 1.安装ftp服务 yum -y install vsftpd ...

  2. 调整Winfrom控件WebBrowser的默认浏览器内核版本

    一.问题解析: 今天在调试程序的时候,需要使用C#的客户端远程登录一个Web页面,用到了WebBrowser控件.但是却发现了一件很神奇的事情:当前浏览器使用的内核,可以通过访问下面这个网站获取:ht ...

  3. Pydiction补全插件

    Pydiction不需要安装,所有没有任何依赖包问题,Pydiction主要包含三个文件. python_pydiction.vim -- Vim plugin that autocompletes ...

  4. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  5. bzoj 2013

    http://www.lydsy.com/JudgeOnline/problem.php?id=2013 最初看这个题的时候,以为神题不可做,然后去找yzjc..然后做法过于简单了(' '       ...

  6. Linux内核学习-进程

    先说几个术语: 一.Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的.重点:代码段.数据段.堆栈段,这是一个概念堆.栈.全局区.常量区,这是另一个 ...

  7. Django基础篇(二)与mysql配合使用

    需求:模拟实现学员管理系统.<*_* 从基础做起> 表结构如下: 班级/学生/老师 班级表: id     title 1       xx 2 xx 学生表: id    name    ...

  8. 《ArcGIS Runtime SDK for .Net开发笔记》--介绍与环境搭建

    一. ArcGIS Runtime SDK for .NET介绍 ArcGIS Runtime SDK for .net是一款针对windows平台的开发包.能够在开发出在windows phone, ...

  9. python singleton 4种单例

    def singleton(cls, *args, **kwargs): instances = {} def inner(cls, *args, **kwargs): if cls not in i ...

  10. VMware 虚拟机NAT模式如何设置网络连接,从头到尾全过程~!!

    一.首先查看自己的虚拟机服务有没有开启,选择电脑里面的服务查看: 1.计算机点击右键选择管理  2.进入管理选择VM开头的服务如果没有开启的话就右键开启  二.虚拟机服务开启后就查看本地网络虚拟机的网 ...