背包问题
文章平均质量分 57
愤怒的北方酱
这个作者很懒,什么都没留下…
展开
-
poj3260解题报告
题目大意: 农夫John想到镇上买些补给。为了高效地完成任务,他想使硬币的转手次数最少。即使他交付的硬 币数与找零得到的的硬币数最少。 John想要买T(1 解题思路: 先来一次多重背包,上限要比t大才行,因为可以找钱,再来一发完全背包,因为找钱这个时候货币是无限的 代码: #include #include #include #include #include using n原创 2015-06-18 16:48:46 · 994 阅读 · 0 评论 -
poj2063解题报告
题目大意:给你M的钱,然后给你n种股票, 每一种股票有一个价值和年收益, 股票价值是1000的倍数, 给你y年的时间, 让你用手里的钱去买股票使得y年后手中的钱最多。 解题思路:完全背包,有几年就做几次完全背包,不过因为每年都在盈利,所以每年的背包容量需要改变为本金加上上一年的盈利 注意点:可以进行空间优化,这一点我没想到,题目已经说了本金与物品的购买价格都是1000的倍数,所以可以将他们都除原创 2015-07-13 16:47:29 · 458 阅读 · 0 评论 -
poj3934解题报告
题目大意:n个小朋友排队(每个小朋友都不一样高)。两个小朋友a和b能够互相看见当且仅当排在它们中间的小朋友比a和b都要矮。已知队伍中一共有m对小朋友可以互相看见,问有可能有多少种排队方式。 思路:应该拿DP来做,一开始我还想拿递归生成全排列,剪枝呢~~后来看了别人思路真的绝了 那个人的思路大概是这样: 状态变量d[i][j]表示i个人,j个对一共有多少种方式 然后对于每一种i个人组成j对的原创 2015-06-14 23:44:27 · 672 阅读 · 0 评论 -
poj3624Charm Bracelet解题报告
典型的又经典的01背包的题~~ 该手镯有两个属性,描述值和重量,重量有限制,每种手镯只有一个,可以取到的最大描述值,经典的01背包问题!!! 所以我们的状态量定为 states[i][j]:第i次取物品,处于j重量时,之后可以取到最大描述值~~ 状态方程:states[i][j]=max(states[i][j],states[i+1][j-w[i]]+d[i]); 边界i=n时, 状态...原创 2015-06-14 15:32:58 · 925 阅读 · 0 评论 -
poj3628解题报告
题目大意:给你n个数和一个指定高度,让你从n个数的选出几个数比指定高度大,但是尽量接近指定高度。 解题思路:明显的01背包,初始全部赋值成0.最后在遍历一次,找到最大的。 #include #include #include #include using namespace std; const int maxn=20000001; int h[21]; int dp[maxn]; int n原创 2015-07-04 10:10:31 · 415 阅读 · 0 评论 -
poj1976解题报告
题目大意:3个迷你火车头拉人,看一次最多能拉多少人。题目要求输入车厢数,每节车厢的人数,以及每个迷你火车头能拉动车箱的数目,要求输出三个迷你火车头能拉动的最多人数。 解题思路:确实没看出来是背包的题,其实3个火车头就是你能取的次数,3次,每次都能取连续的m个 然后状态量就是 dp[i][j]前i个车厢,用j个火车头来拉,最多能拉多少人。 输出解为d[n][3] #include #incl原创 2015-07-03 14:26:04 · 688 阅读 · 1 评论 -
hdu4508解题报告
水题,完全背包~~ #include #include #include #include using namespace std; int n,m; int dp[100008]; int a[108],b[108]; int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n原创 2015-07-08 14:37:25 · 300 阅读 · 0 评论 -
poj2184解题报告
来源:http://poj.org/problem?id=2184 题意:有一些奶牛,他们有一定的s值和f值,这些值有正有负,最后让保证s的和为非负且f的和为非负的情况下,s+f的最大值。 解题思路:有两种价值,最开始我以为是二维背包,不过后来看到1e5的范围,二维数组肯定开不了,所以转换为0,1背包,两种状态的上界都不定,估计个最大值,全搜出来,然后在比较。 注意点:1.开一维数组的话,当原创 2015-06-27 09:26:22 · 682 阅读 · 0 评论 -
poj2392解题报告
又见奶牛,这次的奶牛们要飞天,上太空了!!!!farmer john有木有!!!USACO的题源总是那么逗!!! 题目大意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度 解题思路:多重背包,但注意一开始就要以最高海拔排序一发(通过重载操作符简化代码),然后枚举的时候第二层循环记得用每石头的海拔来逆序枚举!! 代码: #incl原创 2015-06-19 21:34:57 · 486 阅读 · 0 评论 -
hdu1171解题报告
题意大概是:求把总价值分为两个数,使这两个数接近相等,而且这两个数必须由所有设备中的其中几种设备价值构成,并先输出比较大的数,再输出另一个数。 这是一道多重背包的题目,虽然物体本身只有价格这一个属性~~但是可以把这一种属性看做两种属性(价格折半之后,相当于有个属性的限制了),价格本身当两种属性,其次多重背包在空间和时间都比较充裕的情况下可以转换为01背包. 状态量设为d[i][j]原创 2015-06-14 23:42:15 · 1146 阅读 · 0 评论 -
poj1458(最长公共子序列问题)
问题描述:给A,B两个字符串,让你找出最长公共子序列的长度的问题 解题思路:DP 状态变量:d[i][j]表示以Ai和Bj为结尾的字符串的最长公共子序列的长度 状态方程: 当A[i]等于B[j]时d[i][j]=d[i-1][j-1]+1 不等时 d[i][j]=max(d[i-1][j],d[i][j-1]) 边界比较麻烦,你原创 2015-06-18 00:05:43 · 368 阅读 · 0 评论 -
poj2533(最长上升子串)
题目大意:给你一个字符串,你要从里边找到最长的子串的长度,且这个子串必须是升序。 解题思路:DP 状态变量:d[i]以i结尾的最长上升子串的长度 状态转移方程:d[i]=max(d[i],d[j]+1) j 边界:全初始化为1,因为每一个单独的字符都是一个子串 代码: #include #include #include #include using namespace std原创 2015-06-17 23:54:00 · 461 阅读 · 0 评论 -
poj1252解题报告
题意:给6种不同面额硬币,求组成[1,100]中数的平均需要硬币与最多需要硬币数,可以通过减法获得,比如有1、4两种硬币,凑成3可以用4-1两个硬币完成,而不是1+1+1三个硬币。 解题思路:完全背包,不过要两次~~ 如果用一维数组的换,第二次背包记着逆序啊~~ #include #include #include #include using namespace std; con原创 2015-06-18 00:17:00 · 637 阅读 · 0 评论 -
poj1276结题报告
题意:给出一个价值sum,然后给出n,代表n个方案,接着n对代表个数与价值,要求最接近sum,但不超过sum的价值。 解题思路:多重背包,很明显,因为要求最近,所以背包不用满,因此把所有dp数组初始化为0. #include #include #include #include using namespace std; const int maxs=100000+1000; const int原创 2015-07-22 20:02:01 · 418 阅读 · 0 评论