摘要: 此题是一个背包的题目,刚开始我并没有作任何的排序工作,所以出来的结果总是错的,仔细想想也确实是不对的,因为q[i]会限制dp[i]的值的变化。虽然我知道要按照某个量进行排序,对原数据进行处理,但是实在是想不到到底要处理那个数据。于是看了一下大神的博客,原来是要对q-p进行从小到大的排序。对于原因我也... 阅读全文
posted @ 2015-03-04 22:31 Run_For_Love 阅读(87) 评论(0) 推荐(0) 编辑
摘要: 这道题是道很基本的0/1背包的问题,为了使解题很简单一点,可以将题目中要求的最大概率转换成不能录取的最小概率,这样1-dp[n]即为至少有一个offer的最大概率。状态方程为:dp[j]=min{dp[j],dp[j-price[i]]*chance[i]}; 1 #include"iostream... 阅读全文
posted @ 2015-03-04 21:34 Run_For_Love 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 这道题是二维背包的问题,因为这道题里面有时间l和可选数量m两个约束条件。只要0/1背包的基础上再加上一重循环即可,这题需要注意的是初始化的问题,初始化时只有m=0时dp数组为0,其它置为负数。再一个就是程序第三重循环中的那一个判断,此判断的目的是dp[j][k]的最优子结构是否存在。本题的状态转移方... 阅读全文
posted @ 2015-03-04 21:05 Run_For_Love 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 本题的思路是:首先如果m5,则先拿出5元钱买最贵的东西,这样背包容量就变成了m-5,商品数量为n-1的0/1背包问题。此题的状态转移方程为:dp[j]=max{dp[j],dp[j-price[i]]+price[i]},dp[j]表示买前i件商品,预算为j时的最大花销。 1 #include"io... 阅读全文
posted @ 2015-03-03 21:22 Run_For_Love 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 这是道典型的母函数的题目,可以看看我的母函数这一标签上的另一道例题,里面对母函数做了较为详细的总结。这题仅贴上代码:#include"iostream" 2 using namespace std; 3 #define N 130 4 int a[N+1],b[N+1]; 5 int ma... 阅读全文
posted @ 2015-01-27 18:49 Run_For_Love 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 上网搜了一下这道题的解法,主要有两个方法,一种是采用母函数的方法,一种是采用0/1背包的方法。先说一下母函数,即生成函数,做个比喻,母函数就是一个多项式前面的系数的一个整体的集合,而子函数就是这个多项式每一项前面的系数。主要用于解决组合问题,类似于钱币的组合问题。利用母函数解题时,首先要写出表达式,... 阅读全文
posted @ 2015-01-27 13:15 Run_For_Love 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 这道题是典型的dp题。首先是数据的处理上,因为每个长方体的3条不同长度的棱都可以作为高,因此一个长方体可以看成3个不同的长方体。从而将数据扩展为3*n,然后将所有的长方体以长度为第一排序条件,宽度为第二排序条件进行排序。接着整个问题就变成了求最长递减子序列的问题了,多得到的状态方程为:dp[i]=m... 阅读全文
posted @ 2015-01-27 10:12 Run_For_Love 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 这是我做的第六道动态规划水题,对动态规划差不多有了一个大致的概念。动态规划有几个关键因素,第一是最优子结构,第二是状态和状态转移方程。整个过程都是以 最优 为中心的。因此在状态转移方程中常涉及到几个子状态的最优化的判断。这道题既采用了递堆的思想,又采用了一点动态规划的思想。状态转移方程为:f[i]=... 阅读全文
posted @ 2015-01-26 21:07 Run_For_Love 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 本想用暴力法先试试的,案例和自己找的数据都过掉了,但是始终wa,本来期待的是tle,结果始终wa。所以也就懒的管了,直接用dp来做了。主要是因为最近在刷暴力法和dp这两个专题,所以才想好好利用一下这道题。如果有哪位发现了我的第一个程序的错误,还望告知。暴力法(此程序不知道为何wa) 1 #inclu... 阅读全文
posted @ 2015-01-26 15:39 Run_For_Love 阅读(189) 评论(0) 推荐(0) 编辑
摘要: /*这道题是很明显的dp题,状态方程有点不大好想,也许是我刚刚接触dp的缘故吧。dp[i][j]表示字符串s1取前i个字符s2取前j个字符时最大公共子序列的大小,这样的如果s1[i]==s2[j],dp[i][j]=d[i-1][j-1]+1;如果s1[1]!=s2[j],dp[i][j]=max{... 阅读全文
posted @ 2015-01-26 10:14 Run_For_Love 阅读(131) 评论(0) 推荐(0) 编辑