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

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. NHibernet Unable to locate persister for the entity

    第一 xml文件必须为 *.hbm.xml 第二  设置xml文件为嵌入的资源,用鼠标点击右键 然后生成操作里 选择嵌入的资源即可解决. https://www.cnblogs.com/lyj/

  2. 链表反转&交换链表结点

    leetcode链表反转链接 要求摘要: 反转一个单链表 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...

  3. OpenCV常用基本处理函数(7)图像金字塔和直方图

    高斯金字塔 高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的.顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值. 这样操作一次一个 MxN 的图像就变成了一个 M/2xN/ ...

  4. 【leetcode】1006. Clumsy Factorial

    题目如下: Normally, the factorial of a positive integer n is the product of all positive integers less t ...

  5. bootsrap 按钮样式

    <!-- Standard button --> <button type="button" class="btn btn-default"& ...

  6. 【Guava】Guava Cache用法

    背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...

  7. css float 浮动

    CSS Float(浮动) 什么是 CSS Float(浮动)?大理石平台价格 CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列. Float(浮动),往往是用于图像, ...

  8. apue 第19章 伪终端

    伪终端是指对于一个应用程序而言,他看上去像一个终端,但事实上它并不是一个真正的终端. 进程打开伪终端设备,然后fork.子进程建立一个新的会话,打开一个相应的伪终端从设备.复制输入.输出和标准错误文件 ...

  9. AndroidManifest.xml配置文件详解(转)

    转载博客:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重 ...

  10. Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...