使用 php5.2 和 MySQL 4.1.22
我遇到过一些事情,一开始看起来很简单,但后来我却回避了一个简单、干净的解决方案。
我们有预定义的产品“包”。包装 1 中可能包含产品 A、B 和 C。包装 2 可能包含 A、C、D 和 G 等。包装的大小从 3 到 5 个产品不等。
现在,客户可以选择任意 10 种可用产品并制作“定制”包装。由于我们已经有了某些预定义的包,我们希望尽可能使用较小的现有包(为了便于运输)构建自定义包。
因此,例如,客户选择创建产品 A、B、C、D、E 和 F 的“自定义包”。我们已经有一个名为 Foo 的预定义包,其中包含 A、B 和 C。因此,顺序将是 Foo、D、E 和 F。
问题在于拥有最少数量的单个元素,其次是最少数量的包裹。例如:
定制包装:A、B、C、D、E、F、G、H、I、J。
预定义包 (1):A、B、C、D、E
预定义包 (2):A、B、C
预定义包 (3):D、E、F
如果我只取最大的匹配项,那么我有 1 (5pc) 个包裹和 5 个单独的项目。包 (2) 和 (3) 都不能用剩余的项目构建。
如果我看得更深,我发现通过不构建包 (1),我可以构建包 (2) 和包 (3)。这意味着我有 2 个包裹和 4 个单独的元素(在此商业规则中是更好的选择)。
因为我使用的是 MySQL,所以我只能使用一层子选择(据我所知)。所以这种排序需要在 php 中执行。我研究过使用 array_intersect() 来确定匹配项,但随着预定义包的数量呈线性增长,我发现的每种方式在处理方面都呈指数级增长。
我和其他几个程序员 friend 一起跑过这个,虽然看起来应该有一个简单的答案,但我们都发现它并不像看起来那么简单。所以,我想我会把它贴在这里作为一个很好的面条担架。非常感谢您的宝贵时间!
最佳答案
该问题通常是“困难”问题(就计算复杂性而言)。事实上,它在我脑海中敲响了一些警钟,它可能会简化为那些经典的算法问题之一,比如 Knapsack problem。 ,但我无法为其附加专有名称。
然而,由于问题空间如此之小(他们只能选择 10 种产品),暴力破解应该相当快。当有人提交自定义构建时,只需使用所有可能性递归地攻击它,看看哪个是最好的。
也就是说,拿他们选择的组件,首先尝试从中删除“Package 1”的组件。如果可能的话,取出剩余的组件并尝试从中取出“包 2”的组件,等等。跟踪您找到的最佳解决方案。
如果它仍然不够快(但我认为它可能会,这取决于你有多少预构建的包),你可以应用一些 dynamic programming加快速度的方法。
编辑添加:
根据可能性的数量和实际运行所需的时间,您可能想要编写我上面描述的代码,然后继续为每个可能的组合预先计算所有解决方案。然后,当有人提交自定义构建时,您只需获取答案,而不是每次都从头开始计算。
即使您不想预先计算所有这些,我也建议您在每次有人进行自定义构建时存储结果,这样将来如果其他人进行相同的自定义构建,您就不必这样做了重新计算解决方案。
关于php - 寻找一种干净、高效的方法来将一组数据与已知模式进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/736063/
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案