流媒体背包

2012年5月15日

计算机科学中一个著名的问题是背包问题,在背包问题中,你要从人群中找出与给定目标相加的项目组合,通常带有某种约束条件,例如最大化项目的价值。在今天的问题中,我们希望找到第一种可能的组合k正整数流中的整数,其和为n个例如,给定输入流4、8、9、2、10、2、17、2、12、4、5…,我们希望在读取第三个2后立即找到包含4、2、10,2、2的背包,而不读取其后的12、4和5。

你的任务是编写一个接受参数的程序kn个和输入流,并返回第一个可能的背包。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

4对“流媒体背包”的回应

  1. […]今天的编程实践练习,我们的目标是编写一个函数,使第一个可能的[…]

  2. 我的Haskell解决方案(请参阅http://bonsaicode.wordpress.com/2012/05/15/programming-praxis-背包/对于带有注释的版本):

    导入数据。列表背包::数字a=>智力->a->[a]->可能[a]背包k n=查找(\s->长度s==k&和s==n)。子序列
  3. Axio公司

    我想最有效的方法就是计算简单的背包问题,即使用动态编程“向后”,即不进行递归调用,而是使用KP[S][n],找到列表(S+e)所在的KP[S+e][n][追加S(列表e)],从而找到k个和为n的元素。
    不过,现在没有时间编写代码了。

  4. 迈克

    Python 2.7版

    第一个解决方案与praxis解决方案类似,使用map作为sparce数组。我使用(剩余项目,剩余金额)作为键。

    定义背包(s,k,n):d={(k,n):[]}对于e in s:如果d中的(1,e):返回d[(1,e)]+[e]d.更新(j,m)的((j-1,m-e),v+[e]),d.项()中的v如果j>0且m>=e且(j-1,m-e)不在d中)

    第二种解决方案与Remco的类似。subsequences(seq,k)从“seq”中读取项,并生成以最近读取的项结尾的k元组流。

    从itertools导入组合,ifilter定义子序列(seq,k):项目=[]对于序列中的项目:对于组合中的子q(条目,k-1):收益率subsq+(项目,)items.append(项)定义背包(seq,k,n):return next(ifilter(lambda x:总和(x)==n,子序列(seq,k)),无)

留下评论