QuXiao

每天进步一点点!

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  50 随笔 :: 0 文章 :: 27 评论 :: 0 Trackbacks

有N(1<=N<=50)种不同面值邮票,由这些邮票组成面值1~M,1、2、……、M每种面值均由不超过K(1<=K<=200)数目的邮票组成,求最大的M为多少?邮票最大面值为10000

一开始想到DP,数组canComprise[10000*200][200],canComprise[i][j]表示用j张邮票是否可以组成面值i,但数组太大,放弃。

后来改用深搜,优化了许久,最后几组数组仍然超时,放弃。

又回头想DP,如果canComprise[i][j1]和canComprise[i][j2]均为true,j1 < j2,那么canComprise[i][j1]肯定是更优的解,因为j1可以扩展更多i+stamps[x]。所以,只要用一维数组保存答案就可以了,比如minStamp[i] = j就表示组成i所用到的最少邮票数为j,递推式很容易想到:

minStamp[i] = Min{ minStamp[i-stamp[x]] + 1 } ( i – stamp[x] >= 0 )

 

同一种情况,表达解的方式可能有多种,尽量使用最精简的方式,已达到降维的效果。

posted on 2011-02-12 11:59 quxiao 阅读(165) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理