随笔分类 - 背包问题
摘要:题意:选择K个质数使它们的和为N,求总的方案数。分析:虽然知道推出来了转移方程, 但还是没把代码敲出来,可能基本功还是不够吧。d(i, j)表示i个素数的和为j的方案数,则 d(i, j) = sigma d(i-1, j-p[k]) ,其中p[k]表示第k个素数注意递推的顺序是倒着推的,否则会计算...
阅读全文
摘要:题意:小明有一个贤妻良母型的女朋友,他们两个一起洗衣服。有M种颜色的N件衣服,要求洗完一种颜色的衣服才能洗另外一种颜色。两人可以同时洗,一件衣服只能被一个人洗。给出洗每件衣服所用的时间,求两个人洗完这些衣服所用的最短时间。分析:因为每种颜色是分开洗的,所以我们可以单独考虑一种颜色的衣服。因为洗完这些...
阅读全文
摘要:如此水的01背包,居然让我WA了七次。开始理解错题意了,弄反了主次关系。总曲目最多是大前提,其次才是歌曲总时间最长。题意:在KTV房间里还剩t秒的时间,可以从n首喜爱的歌里面选出若干首(每首歌只能唱一次且如果唱就必须唱完),然后剩下至少1秒的时间来唱那首长678秒的歌曲。总曲目最多的前提下,尽量使歌...
阅读全文
摘要:题意:有n个员工,每个员工完成一件A任务和一件B任务的时间给出,问要完成x件A任务y件B任务所需的最短时间是多少思路:DP + 二分我也是第一次见到,这个我只能说太难想了,根本想不到。dp[i][j]表示在t时间内前i个人完成j件A任务后所能完成B任务的最大数量。代码中还有一些注释。 1 //#de...
阅读全文
摘要:这是一道搜索的背包题目题意:有n件物品从中最多选m件,使其总重量不超过v,求能获得的最大重量有一个很重要的剪枝(是数据的问题还是这个剪枝本身很高效?):如果重量最大m件物品都不超过v,则答案就是该m件物品之和;或者最轻的物品的重量大于v则答案为0中间TLE了几次,又WA了几次,好辛苦啊,Orz 1 ...
阅读全文
摘要:题意:有n件物品,对应有不同的价格和价值,这是典型的01背包。但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0代码理解得还不是太好,感觉这是一个“二重”的01背包。首先假设先买第i个盒子,对每个盒子里的物品进行一次01背包;然后对盒子再进行一次01背包,决策到底要不要买这个盒...
阅读全文
摘要:多多想看N个动画片,她对这些动画片有不同喜欢程度,而且播放时长也不同她的舅舅只能给她买其中M个(不多不少恰好M个),问在限定时间内观看动画片,她能得到的最大价值是多少如果她不能在限定时间内看完买回来的动画片,则输出0这里借用大牛的背包九讲的讲义,讲的很清楚问题二维费用的背包问题是指:对于每件物品,具...
阅读全文
摘要:题意:用13、23……k3这些数加起来组成n,输出总方案数d(i, j)表示前i个数构成j的方案数则有d(i, j) = d(i-1, j) + d(i, j - i3)可以像01背包那样用滚动数组来实现 1 //#define LOCAL 2 #include 3 #include 4 #in...
阅读全文
摘要:很标准的01背包问题 1 //#define LOCAL 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 int w[maxn], v[maxn], dp[ma...
阅读全文
摘要:接触动态规划的第一题是数塔问题,第二题就是01背包问题了。当时看的懵懵懂懂,回过头来再看这道题还是非常简单的了。用 dp[i][j] 表示取前i种物品,使它们总体积不超过j的最优取法取得的价值总和状态转移方程:dp[i][j] = max(dp[i-1][j],dp[i-1][j-cost[i]]+...
阅读全文