O興~
 
« 上一篇: PKU 1149, PIGS,构造网络流模型时,要注意合并节点和边 下一篇: 我们需要经常锻炼身体 »
我很懒的 @ 2008-06-04 14:15

    鸽巢原理人人都有耳闻,十只鸽子飞进九个巢,必定有一个巢里不少于两只鸽子。但是真正要用的时候,它却总是来得悄无声息。就像电影《The Blues Brothers》里面的牧师说的:“The day of the Lord cometh is as a thief in the night”。

    ZJU 2955 乍一看是再典型不过的动态规划问题:给出 N (N < 100)个 (0, 100) 范围内的整数,问最少从中取出几个数,可以使它们相加正好等于一个指定的整数 S(每个数可以取的次数不限)。

    有一点 ACM 经验的同学肯定一看就知道这是一个 O(S × N) 的动态规划。可是问题是,这道题目里 S 的范围是 [1, 109]。要解决这个问题,首先需要用鸽巢原理来证明下面这个定理:

    设可选的 N 个数从小到大依次为 a(1)、 a(2) … a(N),则在最优的取法中,小于 a(N) 的数不会多于 a(N)

    可以用反证法来证明。假设在最优的取法中,有 M 个小于 a(N) 的数(M > a(N))。让我们把这 M 个数随便排列起来,记为 b1、 b2 … bM。再设 Si = b1 + b2 … + bi (1 ≤ i ≤ M)。

    由于一个数除以 a(N) 的余数只有 a(N) 种可能性,即 0 到 a(N) - 1,又因为 M > a(N),所以一定存在一对 Si 与 Sj (1 ≤ i < j ≤ M)满足 Si mod a(N) = Sj mod a(N)。也就是说,Sj - Si 是 a(N) 的倍数,也就是说,bi + 1 + bi +2 … + bj 是 a(N) 的倍数。然而,根据之前的假设,b1 … bM 都是小于 a(N) 的。因此,如果把 bi + 1 + bi +2 … + bj 这一块全部用 a(N) 来填补,则可以用更少的数。这样一来,假设中的取法就不是最优取法了。反证完毕。□

    有了上面的定理,问题就好解决了。不多于 a(N) 个小于 a(N) 的数,加起来的和不会超过 a(N)2 ,即不超过 10,000。S 在这个范围内的最优解是可以用动态规划全部求出来的,花 O(106) 的时间。如果 S > a(N)2 的话,只要枚举所有的 S’ ∈ [1, a(N)2],然后 S - S’ 的部份全部用 a(N) 来填充,即可找到最优解。



最新评论


Tiaotiao

2008-07-26 23:54 匿名 125.65.*.*

找这个题答案很久了~多谢大牛!^^

不用谢。


桔字奶油

2008-09-25 15:20 匿名 117.25.*.*

那些公式的上下标是怎么输入的?_?
不会是手工写html标签吧,那么大的工作量。
告诉我简单的方法吧。。
先谢过啦~~

确实是手工打的。用复制粘贴的话,也不是特别费事。

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

已经注册过? 请登录

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

Email
网址
* 评论
表情
 


 

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

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

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

日历
网志分类
· 所有网志
· program
· 未分类
站内搜索
友情链接
· 歪酷博客
· 管理我的Blog
· jamie
· feemi
· lyrist
· tata
· allen
· richard

订阅 RSS

0056259

歪酷博客