dp
文章平均质量分 66
671coder
I am 671coder.
www.671coder.com
展开
-
POJ1252 完全背包 dp 搜索 dfs bfs
今天见到一道不错的水题,但是卡了我两次,是道完全背包,也可以用搜索,因为刚刚开始练习背包,可谓入门,感觉这是道不错的题,就用dp小试一下。连接:http://poj.org/problem?id=1252题目大意:给6种不同面额硬币,求组成[1,100]中数的平均需要硬币与最多需要硬币数,可以通过减法获得,比如有1、4两种硬币,凑成3可以用4-1两个硬币完成,而不是1+1+1三个硬原创 2013-01-20 15:03:33 · 4486 阅读 · 0 评论 -
Uva 674 Coin Change 完全背包
题目链接:here题意:5种硬币,输出组合数代码:#include #include #include using namespace std;const int maxn = 7500;int coin[5] = {1,5,10,25,50};int dp[maxn];int m;int main(){ int i, j; memset(dp, 0, s原创 2013-04-16 19:18:30 · 2467 阅读 · 1 评论 -
Uva 147 Dollars 完全背包
题目链接:here题意:和uva674差不多。。11种金币,输出能组成给定数额的方法个数代码:#include #include #include using namespace std;const int maxn = 30010/5;int coin[11] = {1,2,4,10,20,40,100,200,400,1000,2000};long long dp[原创 2013-04-16 19:23:16 · 2405 阅读 · 0 评论 -
【DP_概率DP专辑】【10、4最新更新】【from zeroclock's blog】
进入大学之后发现自己对概率问题很不感冒,其实一直都是这样,高中就没好好读数学。概率不好的结果就是对概率类dp掌握得just so so,因为对这类dp的状态和转移不敏感,要么是yy,要么是花很长时间想状态想转移。 现在痛下决心,好好虐待自己一段时间,做下概率dp。 Codeforces 148D Bag of mice 状态转移方程比较难想,开虚拟比赛的时候转载 2013-01-07 16:49:20 · 5686 阅读 · 0 评论 -
poj1787 Charlie's Change 完全背包
题目链接:here题目大意: 分硬币,有1,5,10,25四种硬币,给定每种硬币的数量,给定要组合成的价值,问刚好达到价值时用的硬币最多的情况。分析: 感觉上是多重背包,实际上用完全背包的思路来做很快! dp[j] 表示 j 块钱最多由多少块硬币组成, path[j] 表示 上一次最多有多少块构成的 j 块钱, used[j] 表示 j原创 2013-05-16 20:00:32 · 3385 阅读 · 0 评论 -
【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树、三叉树、静态搜索树、AVL树,线段树、SPLAY树,后缀树等等.. 枚举那么多种数据结构只是想说树方面的内容相当多,本专辑只针对在树上的动态规划,即树形DP.做树形DP一般步骤是先将树转换为有根树,然后在树上进行转载 2013-01-07 16:47:08 · 17363 阅读 · 3 评论 -
poj3181 Dollar Dayz dp
题目链接:here题目大意: n 块钱 如何由 1-k 块钱组合起来的方法。。分析: 完全背包。。但是注意高精度。。代码:java:import java.math.BigInteger;import java.util.Arrays;import java.util.Scanner;public class poj3181dp原创 2013-05-15 07:11:01 · 2452 阅读 · 0 评论 -
数位DP 题集
数位DP 题集/*-------------------------------------------------------------------------*/常用数位DP写法:int dfs(int i, int s, bool e) { if(i==-1) return s==target_s; if(!e && ~f[i][s]) re原创 2013-06-17 09:35:28 · 9171 阅读 · 0 评论 -
hdu1712 ACboy needs your help 我的ACM我的梦,回顾篇 分组背包
题目链接:here 题目大意:一开始输入n和m,n代表有n门课,m代表你有m天,然后给你一个数组,val[i][j],代表第i门课,在通过j天去修,会得到的分数。求在m天能得到的最大分数。 题目分析: 典型的分组背包问题,如果不会的可以看一下背包九讲,在这里也会稍作解释。 看下背包九讲中的描述:原创 2014-05-28 11:07:58 · 2583 阅读 · 0 评论 -
hdu1059 Dividing 我的ACM我的梦,回顾篇 完全背包
题目链接在此原创 2014-05-23 12:00:29 · 3659 阅读 · 0 评论 -
背包问题九讲【转】
背包问题九讲 v1.0前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。现在你看到的是这个写作计划最先发布的一部分。背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道转载 2013-01-20 11:39:55 · 21413 阅读 · 3 评论 -
【DP_背包专辑】【4.04最新更新】
(解题报告本人所写,博客内容转自zeroclock)这短时间看了论文《背包九讲》,看到背包问题解法中的优美之处也看到背包问题在现实中的应用,总结出一句话:背包问题值得一看。 背包问题可以概括为这样的模型:有若干种选择,每种选择有一定的代价和价值,做某些选择会得到特定的状态,问我们在约定的条件下怎么得到特定的状态?这里的状态可以是代价和或者价值和或者由其他这两者组合而来的状态。这类问题原创 2013-01-07 16:46:01 · 11744 阅读 · 1 评论 -
状态压缩DP 树形D
状态压缩动态规划 动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。 *:一般有个数据 n *:确定了为状态DP,那么第一步就是预处理,求出每行所有可能的状态了,cnt记录总的状态数,stk[]记录所有的可能状态。以炮兵阵地为例: i转载 2013-04-02 16:14:49 · 5281 阅读 · 0 评论 -
【DP_区间DP专辑】
区间DP是一类在区间上进行动态规划的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维。然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两个区间合并到整个区间,或者说局部最优解合并为全局最优解,然后得解。 这类DP可以用常规的for循环来写,也可以用记忆化搜索来写,个人更倾向于记忆化搜索写法,因为这种写法相当易懂,要什么转载 2013-04-13 17:11:50 · 9926 阅读 · 0 评论 -
经典DP 嵌套矩形
dp初级入门必学,有南阳理工学院OJ的题在此:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 简单dp,刘汝佳白书第一本,161页。稍微理解下就会了。。很easy#include #include #include using namespace std;#define max(a,b) ((a)>(b)?(a):(b原创 2013-03-29 10:47:34 · 3143 阅读 · 0 评论 -
uva624 CD 01背包 打印路径
链接:点我打印路径的简单01背包~~#include #include #include using namespace std;const int maxn = 10005;int main(){ int m, n, cd[25], dp[maxn]; bool vis[25][maxn]; while (scanf("%d %d", &m, &n) != EOF)原创 2013-04-01 15:20:47 · 3831 阅读 · 2 评论 -
uva562 Dividing coins 01背包 平衡问题
链接:点我就是给你银币让你平衡。。。输出最小相差多少。。。。说实话题不明白怎么做。。但是AC还是没啥问题的。。。。就跟着感觉写啊写啊。。然后就AC了。。。#include #include #include #include using namespace std;#define min(a,b) ((a)<(b)?(a):(b))const int maxn = 50005原创 2013-04-01 16:17:51 · 2978 阅读 · 0 评论 -
hdu2602 dp 01背包
链接:点我很简单的01,注意第一排输入的是价值,第二排是体积。。#include #include using namespace std;#define max(a,b) ((a)>(b)?(a):(b))const int maxn = 1005;int main(){ int T; scanf("%d", &T); int dp[maxn], val[maxn]原创 2013-04-01 13:00:45 · 3534 阅读 · 0 评论 -
hdu2546 饭卡 (dp 01背包)
链接:点我简单01,先计算出m-5块钱在n-1个物品内最多买多少钱的菜,然后再减去最大价格的菜就行。。#include #include #include using namespace std;#define max(a,b) ((a)>(b)?(a):(b))#define inf (0x7f7f7f7f)const int maxn = 1005;int main()原创 2013-04-01 13:05:51 · 3509 阅读 · 0 评论 -
hdu2639 Bone Collector II 01背包边形,第k大价值
链接:点我现在01的基础上多加一维,dp[v][k],表示在v空间下第k大的价值。。。更新的时候有两个数组A、B,A记录选择第i个物品的从大到小排列,B记录不选择的从大到小排列,然后合并AB,选出AB里面前k个最大的。合并到dp中。。。#include #include using namespace std;#define max(a,b) ((a)>(b)?(a):(b))原创 2013-04-02 15:56:08 · 3787 阅读 · 0 评论 -
hdu2955 Robberies 01背包 dp
链接:点我题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。分析:我第一眼看的时候觉得见到01,然后弄一个dp[100],把概率*100。。。。。。如果你和我一样这么想。。那么恭喜你上当了!需要把money当做下标。。。保存的是概率。。。状态转移方程:dp[j] =原创 2013-04-01 19:15:40 · 4140 阅读 · 0 评论 -
hdu3466 Proud Merchants 01背包 排序 dp
链接:点我题意:每个物品有p、q、v,三个属性,每个物品的话费为p,但是前提是必须有q,v则是得到的价值。咋一看直接01就行,但是需要排序,因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m],再对第二个进行背包的时候,如果是普通的,应该会借用前面的dp[8],dp[7]之类的,但是现在这些值都是0,所以会导致结果出错。于是要想到只原创 2013-04-02 22:50:04 · 2991 阅读 · 1 评论 -
hdu2126 Buy the souvenirs 01背包变形 dp
链接:点我题意:n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。加一维表示已经买几件物品。我这里用了一个数组dp[v][2] ,dp[v][0] 储存原本要记录的 dp ,而 dp[v][1] 则记录方案数目。记住需要初始化,把所有 dp[i][1] 都设置成1。#include #include #include using namespace st原创 2013-04-02 22:56:39 · 3019 阅读 · 0 评论 -
poj2184 Cow Exhibition 01背包 变形
链接:点我 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和funness值的和最大,而这些牛有些smartness或funness的值是负的,还要求最终的smartness之和以及funness之和不能为负。 这道题的关键有两点:一是将smartness看作花费、将funness看作价值,从而转化为01背包;二是对负值的处理,引入一个shi原创 2013-04-02 22:41:34 · 5172 阅读 · 6 评论 -
100个动规方程
100个动规方程 1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]); 3. 线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1}转载 2013-04-07 07:11:19 · 8473 阅读 · 2 评论 -
poj3624 dp 01背包
链接:点我很简单的01。。。#include #include using namespace std;#define max(a,b) ((a)>(b)?(a):(b))const int maxn = 3405;int main(){ int n, v; int dp[4*maxn], val[maxn], vol[maxn]; while (scanf("%d原创 2013-04-01 13:02:52 · 2997 阅读 · 2 评论