![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划_背包问题
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
HDU【2602】Bone
Bone CollectorTime Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionMany years ago , in Teddy’s hometown there was a man who was calle原创 2016-01-20 10:47:30 · 333 阅读 · 0 评论 -
POJ Space Elevator(排序+多重背包)
题目分析 好久没有写背包了,因此找了一个多重背包练一下,因为多重背包是01背包和完全背包的结合,手生,写了有一会!!! 就是给你一下砖块,每一个砖块一个高度,给出数量和这样砖块最多能放的高度。。 这道题因为每个点的限制不一样,所以需要从限制小的先进行dp,因为限制大的可以放在限制小的上面,但是限制小的无法再往大的上面堆,这样就算错了。。#include <cstdio>#incl原创 2016-10-31 16:33:51 · 564 阅读 · 0 评论 -
POJ 2923 Relocation(状态压缩+背包思想)
题目分析 因为是判断2辆车能够运多少次才能把所有的物品给运完,因为物品数不够多,因此可以枚举状态,判断每个状态能否由2辆车给运完,这里面可以用01背包的思想进行判断,然后自己就可以通过状态压缩写出状态转移方程,很明显dp[(1<<n)−1]dp[(1<<n)-1]就是答案。#include <cstdio>#include <cstring>#include <iostream>#inc原创 2016-10-31 12:23:31 · 536 阅读 · 0 评论 -
HDU 3602 2012(2010 ACM-ICPC Multi-University Training Contest(16)——Host by NUDT)
//dp[i]表示挣i块钱最少需要的座位数//01背包的思想,大家可以这样想,对于每个船我们可选可不选,那么这样//很明显就是一个01背包了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e4+10;con原创 2016-09-14 10:54:39 · 394 阅读 · 0 评论 -
HDU 3466 Proud Merchants
题目分析 这道题一眼看上去就知道是一个01背包问题,但是需要预处理一下才行,每个背包均有P,Q,V3个属性,但是我们需要怎样选择呢,加入有2个物品,A(P1,Q1,V1),B(P2,Q2,V2)。很明显先买A后买B需要P1+Q2,先买B后买A需要P2+Q1,很明显选择2者之中价格小的,加入前者小于后者,那么P1+Q2#include <cstdio>#include <cstring>#in原创 2016-07-04 10:00:34 · 313 阅读 · 0 评论 -
HDU 2845 Beans
题目分析 这道题很明显就是求最大的序列,但是选择的时候有要求,对于同一行来说,选取了一列,则相邻列的都不能选择,对于不同行,选取了这一行那么相邻行不能选,这样结果已经很明显了,做2次dp就可以了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;c原创 2016-06-16 16:33:11 · 214 阅读 · 0 评论 -
HDU 1864 最大报销额
题目分析 这道题是一个很显然的01背包问题,但是需要注意一下几点:1.每张发票的总额不得超过1000元。2.单项物品的价值不得超过600元。3.只能报销A,B,C三种物品,有其他物品的一律不给于报销。4.这道题精确到小数点后2位,因此只需要将double类型*100保存为整型即可。5.每种类型的物品可能会多次给出(不止一次)。#include <cstdio>#include <cstrin原创 2016-06-16 12:03:06 · 311 阅读 · 0 评论 -
HDU 2639 Bone Collector II
题目分析 这道题要求第K大背包,很显然数组增加一维K,01背包的状态转移式 为dp[i][j] = max(dp[i-1][j], dp[i-1][j-vol[i]] + val[i]); 很明显可以看出dp[i][j]只与公式后面的2个状态有关,因此只要在推的过程中 保存中间值,然后取出前K大的存储在dp[i][j][1…K]之中即可;#include <cstdio>#原创 2016-06-16 10:10:20 · 338 阅读 · 0 评论 -
HDU 3496 Watch The Movie
题目分析 这道题毒很深,因为前一题写的也是2维背包,写到这一题直接就把状态转移方程写出来了,但是一直wa到死,完全不知道为什么!!后来看了一下别人的博客,博客上说有可能价值为负数!!我就呵呵哒,我在想这个女孩中毒不浅呀!!自己不喜欢的也列出来让她uncle买!!于是把初始化给改了就过了!!。#include <cstdio>#include <cstring>#include <iostr原创 2016-06-14 11:39:53 · 362 阅读 · 0 评论 -
HDU 2159 FATE
题目分析 大家都知道2维的01背包可以压缩为1维的,同样1维的完全背包也是可行的, 平时我们做的题得到一件物品牺牲的是体积,但这道题不一样,这道题牺牲了 忍耐度和xhd能杀死的怪的个数,这样一来就很明显了,直接套用公式,然后 加上怪的个数这一维就可以了。#include <cstdio>#include <cstring>#include <iostream>#incl原创 2016-06-14 10:20:49 · 218 阅读 · 0 评论 -
HDU 1059 Dividing
多重背包,模板题,直接上代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int a[10],dp[300005];int main(){ int kase = 1; while(scanf("%d", &a[1]) != EOF原创 2016-06-13 20:28:12 · 242 阅读 · 0 评论 -
HDU 1114 Piggy-Bank
题目分析这道题很明显是一道完全背包问题,每种硬币相当于无数个,但是初始化的时候应该注意,应该初始化为INF,这样才能求出最小值,最后只需要判断一下dp[硬币的总价值]是否等于INF即可,大家同时需要注意一点,我用memset将dp初始化为INF,为什么这样可以呢,因为INF我用的16进制表示,memset是按照1字节为单位对内存进行扩充,所以这样写是合理的,但是初始化为1就不行,初始化为-1可以,因原创 2016-06-13 12:01:49 · 321 阅读 · 0 评论 -
HDU 2844 Coins
题目分析这道题很明显是一道完全背包的题,但是对于只学过01背包的菜菜来说很明心要超时,于是开始学习背包九讲,这里我先摘取一段优化的代码: 另一种好想好写的基本方法是转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的01背包问题,直接求解,复杂度仍然是O(V*Σn[i])。 方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费原创 2016-06-04 11:56:53 · 290 阅读 · 0 评论 -
hdu【1712】ACboy needs your help
ACboy needs your helpTime Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5878 Accepted Submission(s): 3201Problem DescriptionACboy ha原创 2016-03-31 20:38:39 · 208 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2)
A. Arpa’s hard exam and Mehrdad’s naive cheat 找规律即可。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int main(){ int n; while(scanf("%d", &n)原创 2016-12-16 12:21:26 · 285 阅读 · 0 评论