继续讲故事~~
上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定。之后,他就决心去大城市闯荡了,看一看外面更大的世界。
这天,丁丁刚回到家,他的弟弟小连就拦住了他,“老哥,有个问题想请教你。”对于一向数学见长的小连,这次竟然破天荒的来问自己问题,丁丁感到不可思议:他俩一个以计算机见长,一个以数学见长,各自心里都有点小骄傲,不会轻易地向对方问问题。丁丁迟疑了一会儿,慢慢说道:“有什么问题是我们数学小天才解决不了的?”
原来小连刚上高一,正在学数学中的集合,这不,今天他从一本算法书上看到一道题,想了很久都没有想出来。他把题目给了丁丁看:
对于某个给定值M,如何从某个给定的正整数集合S中找个一个子集合s,使得该子集和为给定值M。如M=7,S={1,3,4,5},则s={3,4}.
看到这道题目,丁丁脑海中掠过“动态规划法”的念头,对于动态规划法,他已经是轻车熟路了,但是对于究竟能否用动态规划法解决这个问题,他一时也没主意。于是,他对小连说道:“这题也许可以用动态规划法解决,不过我得好好想一想。”小连点点头,他还是蛮相信他的哥哥的。
丁丁走进自己的房间,拿出草稿纸,开始了思考的旅程:
对于S={a1,a2,...,an},每个元素只有取与不取两种情况,再考虑它们的