摘要: 题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。mark:又是变种01背包,每做一个变种的,就是一种提高。。按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。#include#include#includeusing namespace std;const int MAXN=5005;int dp[MAXN];struct Node{ int p,q,v;}node[505];bool cmp(Node a,Node b){ return (a.q-a.p)=node[i].p;j--) ... 阅读全文
posted @ 2013-07-21 21:07 紫忆 阅读(731) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2639题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混起来,它第一行是价值,再是体积)思路:首先dp[i][j]代表的是在体积为i的时候第j优解为dp[i][j]......那么,我们就可以这样思考,i对应体积,那么如果只是一维的dp[i],代表的应该是体积为i时的最大值,那么同理,dp[i][1]代表的是体积为i时的最大值,那么我们就可以退出两种动态,dp[i][m],dp[i-s[i][0]][m]+s[i][1].....然后把这两种状态开个两个 阅读全文
posted @ 2013-07-21 20:03 紫忆 阅读(1972) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2184题意:给定两个属性,求这两个属性的和的最大值.........思路:将第一个属性往后平移1000个单位,然后推导其动态转移方程,若是dp[i],代表当加入第一个属性加到i时,符合题意的第二个属性的最大值......题意是两个属性的和的最大值,那么动态转移方程必然不是dp[j]=max(dp[j],dp[j-s[i][0]]+s[i][1]),因为这个动态转移方程固然可以求出第二个属性的最大值,但别忘了题意要求第一个属性与第二个属性的和的最大值,那么,第一个属性平移了1000个单位,在考虑动态转移时,是必须要将这个考虑进去的。可以开一个 阅读全文
posted @ 2013-07-21 11:15 紫忆 阅读(1052) 评论(0) 推荐(0) 编辑