随笔分类 -  DP

HDOJ 2546 饭卡
摘要:这道题让我纠结了很久,原来的思想是对的却又找出了理由否定自己,折腾半天还是相信第一感觉的好。首先找出最大的价格mx,然后让其它的做0/1背包,让其总和逼近dp[m-5],这应该很好理解,最后能买到的最多食物就是dp[m-5]+mx,所以余额为m-dp[m-5]-mx;不过还要判断m<5的情况就是买不到(题意规定)。代码:#include<iostream> #include<algorithm> using namespace std; int a[1005],dp[1005]; int main() { int n,m,mx,i,j,pt; while( sca 阅读全文

posted @ 2012-07-21 11:26 java课程设计例子 阅读(235) 评论(0) 推荐(0)

HDOJ 2192 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
摘要:一个多重背包的问题,如果还不了解多重背包,建议看背包九讲http://love-oriented.com/pack/#sec5,当然要深刻理解0/1背包和完全背包之后看多重背包就很简单。代码:#include<iostream> using namespace std; int dp[105],v,n[105],vl[105],ct[105]; void ZeroOnePack(int cost,int value) { for(int i=v; i>=cost; i--) dp[i]=max(dp[i],dp[i-cost]+value); } void Com... 阅读全文

posted @ 2012-07-21 09:36 java课程设计例子 阅读(168) 评论(0) 推荐(0)

HDOJ 1864 最大报销额
摘要:今天做的两道DP和我以前做的不同,以前没试过换个变量来当作背包的容量,前面一道题奠定了这题的基础,这道题一看见的时候就知道用支票的个数来当容量,这道题有点题意不清,没看discuss的时候我也把题意理解错了,它说单项物品不超过600元其实是此类物品不超过600元,这道题也不能完全按照Robberies来做,这里有金额q的限制.转移方程为d[i]=max(d[j])+p[i]; 1=<j<i;代码:#include<iostream> #include<cmath> using namespace std; double dp[35],p[35]; int m 阅读全文

posted @ 2012-07-19 21:04 java课程设计例子 阅读(231) 评论(0) 推荐(0)

HDOJ 2955 Robberies
摘要:一看题目的时候知道是0/1背包,就是不知道怎么入手,因为我们做的0/1背包是整数,如果用被抓率当容量的话要化成整数,根本无法做。也想过用银行金额来做容量,但是没想到用逃脱率当价值。纠结啊!这里涉及一个概率论的问题,如果用被抓率来算是加法,用逃脱率来说是乘法,因为总的被抓率等于每一次被抓率的总和(或的关系|只要有一次被抓就失败了)。逃脱率的话等于每一次逃脱率的乘积(且的关系|保证每次逃脱才算成功)。懂了这些0/1背包就没有压力了。代码:#include<iostream> #include<cmath> using namespace std; int b[105]; d 阅读全文

posted @ 2012-07-19 16:59 java课程设计例子 阅读(161) 评论(0) 推荐(0)