日历
网志分类
· 所有网志 (54)
· 随便说说 (8)
· TopCoder (17)
· 心情自语 (4)
· ACM-ICPC (10)
· UNIX/LINUX (2)
· 我看影视剧 (1)
· 生活记录 (5)
· 我的学习 (5)
· 未分类 (2)
站内搜索
友情链接
· 我的歪酷 非非共享界

订阅 RSS

0013141

歪酷博客

Saga's blog

不知道未来确切在哪
只能努力做好最近的事情


« 上一篇: 关于开发流程 下一篇: URAL 1002 »
acsaga @ 2008-04-13 11:24

昨晚做srm,花了很长时间把div2 1000做了。也算没有白熬夜。。

题意:
有n块石头,每块石头的重量分别是W1 W2 ... Wn。现在有能装重量为cap的石头的背包m个。问最多可以装多少石头。
其中 n <= 13 , m <= 10, Wi以及cap都小于等于20。

思考过程:
贪心是不对的。每个背包里取的石头,大小不一定是连续的。比如 1 2 3 4 背包大小为5,则要1 4一个包,2 3一个包。
数据范围很小,选取的石头可以用二进制位表示。状态总数是1<<13。
那么要找的就是用m个背包,所能达到的石头数量最多的状态。
要解决m个背包的问题,先解决1个背包的问题。1个背包所能达到的不同的状态,可以通过枚举或搜索来得到。因为石头最多才13个。
然后解决m个背包的问题。m个背包,其实就是1个背包问题的叠加。由于最多只有10背包,所以搜索就可以解决m个背包的问题了。
这样问题就解决了。

注意:
单纯的搜索会超时。需要加一些优化。
在解决1个背包状态问题的时候,只需要保留那些"满的状态"。也就是说不能再放入其他任何一块石头的状态。
在解决m个背包状态问题的时候,可以进行记忆化。memo[x][bitmask]表示还剩下x个背包,并且已经选择了bitmask所表示的石头,所能得到的最优结果。其中bitmask表示的是选择的石头的二进制表示。

是一道好题。



曾经的这一天...



评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定