使用提供的最小超龄计量单位来适应目标总和的算法

Posted

技术标签:

【中文标题】使用提供的最小超龄计量单位来适应目标总和的算法【英文标题】:Algorithm to fit into goal sum using provided units of measure with least overage 【发布时间】:2019-12-18 18:35:58 【问题描述】:

这是一个例子:

客户订购了 57 件单件商品。公司只在 15 和 6 的单位。

算法必须找出 UOM(计量单位)的最佳可能组合,并按重要性顺序排列以下优先级

    最少的超龄 使用最高计量单位

在这个例子中,预期的结果是List<int>:

15, 15, 15, 6, 6 //sum=57

我研究了“装箱”和“背包问题”,但不知道如何在这种情况下应用它。

到目前为止,我有这个显然没有达到最佳组合。

    void Main()

    var solver = new Solver();

    var r  = solver.Solve(57, new decimal [] 6, 15).Dump();



public class Solver

    public List<decimal> mResults;

    public List<decimal> Solve(decimal goal, decimal[] elements)
    

        mResults = new List<decimal>();
        RSolve(goal, 0m, elements, elements.Where(e => e <= goal).OrderByDescending(x => x).FirstOrDefault());
        return mResults;
    


    public void RSolve(decimal goal, decimal currentSum, decimal[] elements, decimal toAdd)
    
        if(currentSum >= goal)
            return;

        currentSum += toAdd;
        mResults.Add(toAdd);

        var remainder = goal - currentSum;


        var nextToAdd = elements.Where(e => e <= remainder).OrderByDescending(e => e).FirstOrDefault();

        if(nextToAdd == 0)
            nextToAdd = elements.OrderBy(e => e).FirstOrDefault();

        RSolve(goal, currentSum, elements, nextToAdd);

    

【问题讨论】:

*** 不是代码编写服务,这显然是一项家庭作业。向我们展示您到目前为止所做的工作以及遇到的具体问题,我们可以帮助您解决。 另外,解决方案是添加 15,直到 value + 15 > 57。然后以大小 6 重复。十进制是错误的类型,这些显然应该是整数。 您可以使用 2 个循环来完成。这就是你所需要的。虽然您经常可以在循环和递归之间切换,但这似乎是一个非常简单的循环案例。 不明白。答案中的一些示例代码会很棒。 【参考方案1】:

这是change-making problem 的一个实例。可以通过动态规划求解;构建一个数组,其中索引 i 处的值是可以在总计 i 的解决方案中使用的最大硬币,如果没有解决方案可能,则为 -1。如果您首先使用较大的单位,则解决方案将自动满足“最高计量单位”的要求;为了满足“最少超龄”的要求,您可以尝试为 57 找到解决方案,如果这不起作用尝试 58,依此类推。

运行时间最多为 O((n + 1 - n₀)k) 其中n 是要求的总和,n₀ 是缓存中最大的索引,k 是度量单位的数量。特别是在尝试 57 之后,尝试 58 最多需要 O(k) 时间,然后尝试 59 最多需要 O(k) 时间,以此类推。

要为总和 n 构建输出列表,初始化一个空列表,然后在 n > 0 时将值附加到缓存中的索引 n,然后从 n 中减去该值。

【讨论】:

一些类似 c 语言的代码会很有帮助。 @boruchsiper 我们不会提供家庭作业的代码。写自己是学习的一部分。一旦你知道从哪里开始,这真的是非常微不足道的。这是两个循环。不是量子物理学。 对于已经学会怎么做的人来说是微不足道的;对于目前正在学习的人来说,这不是小事。但无论如何,重要的是你自己尝试一下。 initialize an empty list, then while n &gt; 0 append the value in the cache at index n, and subtract that value from n. that value 是什么? 另外,在索引 n 处添加值意味着在开始时在索引 57 处。对我来说没有意义

以上是关于使用提供的最小超龄计量单位来适应目标总和的算法的主要内容,如果未能解决你的问题,请参考以下文章

盐计量常用算法

python kayb算法之从一组序列当中获取一组与目标值最接近的算法

具有最小尺寸约束的聚类算法

基于最小均方误差(即LMS)的自适应滤波器设计(毕业论文)

Matlab自适应滤波算法 LMS小白通俗易懂版

寻找子集组合以实现给定总和同时保持成本最小的算法