- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 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/
将此矩阵视为一个内存。 p00 p01 p02 p03 p04 p05 p06.... p0n
一般,您如何确定如何根据已知模式迭代数组? 具体,这是我想要迭代的模式,返回一个数组数组:(每个数字都是原始数组的索引值:[0, 1, 2, 3] ) 0 0,1 0,1,2 0,1,2,3 1 1,
问题: 我正在编写一个 C++ 程序,我想在其中从 TCP/IP 套接字读取数据流。数据由几个不同长度和数据类型的数据包组成,但是,它们都是以十六进制格式接收的。在此图中可以看到数据包的长度及其数据类
使用 VC12(在 Visual Studio 2013 RTM 中)[1] 编译此程序会导致崩溃(在所有构建配置中),而实际上它不应该: #include void foo(std::string
我有一个 Snakemake 规则,适用于数据存档并本质上解压其中的数据。文件包含我在规则开始之前知道的不同数量的文件,因此我想利用它并执行类似的操作 rule unpack: input:
有这样的 list 吗? 我对 iOS 开发比较陌生,我认为研究最知名的编译器错误或陷阱列表会很棒。 编辑: 今天我花了太多时间来理解这样的代码发生了什么: 在 *.h @interface I :
如何选择已知 div 中的最后一个子元素,其中该子元素是未知元素。即:元素可以是段落或无序列表。 大多数情况下结构是: Text 但在其他情况下,结构将是: Text More Text
我想绘制以下内容: x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] y = [10, 20, 1, 8, 7, 2, 3, 7, 11] 作为条形图
关于未知列表的排序问题,人们已经知道很多了。但是,在堆栈机器中找到已知列表的最佳排序问题呢?也就是说,假设您有以下堆栈计算机: [4,1,3,2] [] [] 也就是说,有3个堆栈的空间,其中1个堆栈
正如主题中所写,我必须使用 mechanize 更改某些输入字段的值,但我没有它的名称只有 id:/让我们坚持这一点。 表单是这样的:
我只是回想起我的大学类(class),想知道这里是否有人在专业环境中使用过“Z 符号”。老实说,这是我一生中参加过的最无聊的类(class)。也许是因为老师,但当时我们真的都认为这是浪费时间。我可能错
我正在尝试编写一个函数来获取 Windows 等效的 HOME。我的 C 技能生疏了,所以请不要介意我的示例代码无法编译。我试图在 Windows Vista 和更新版本上使用 SHGetKnownF
我想找到一个正整数矩阵B,使得AB = BC,其中A和C是具有共同特征值的正整数矩阵。对于这种情况,存在解,但不唯一;我只需要一种解决方案。 有人知道 python 或 matlab 中可以执行此操作
如果您有两个二进制 blob,x 和 y。然后将它们散列在一起,假设使用 SHA-512。入侵者知道 y,这会使反转哈希变得容易多少? 是否有关于 y 有多大并且可以与 x 比较才成为问题的指南?这有
我正在使用Angular-Stripe-Checkout library创建像这样的 stripeToken example 。一些亮点如下所示。 与许多 Angular-stripe 库和示例一样,
我有一个带有 (e,n) 加密数据的公钥,必须通过 RSA 获取纯文本,并且所有这些都在 C 中! 首先我想知道如何找出我的 p 和 q 是什么?我知道它们必须是质数和 p<>q! 最佳答案 首先,因
表1(客户表) Id, CustomerId, IsKnownCustomer,phonemacaddress 1, 空 0 00:9a:34:cf:a4 2, 004024 1 00:6f:64:c
问题是找到第 n-th Catalan 数 mod m,其中 m 是 NOT prime , m = (10^14 + 7)。以下是我尝试过的方法列表:(max N = 10,000) 查表的动态编程
每当我打开我的应用程序时,我都想将我的应用程序连接到一个已知的 wifi 网络/ssid。即使手机当前通过 3G 或任何其他 wifi 网络连接。 仅使用 phonegap/html5 是否可行? 最
我正在做一个项目,我想为特定的用户组(具有管理员角色)实现实时通知,经过一些研究,我明白我需要 session 才能知道哪些用户已登录(默认情况下他们是匿名的)。 另外,我只需要向特定用户发送通知。
我是一名优秀的程序员,十分优秀!