解决最赚钱的算法

时间:2014-11-20 02:36:41

标签: python algorithm

我正在为即将到来的求职面试练习算法,而我无法正确实施此面试。我也试图最大限度地提高效率。这是问题所在:

最大限度地提高销售金属棒的业务利润。如果您销售长度为L的N根金属棒,则会收到N * L * metal_price。其余较小的金属杆将被抛弃。要切割金属棒,您需要为每次切割支付cost_per_cut。您可以获得的最大利润是多少?

constraints:
lengths will be 1 to 50 elements, inclusive.
each element of length will lie in range [1,10000]
1 <= metal_price, cost_per_cut <=1000

示例输入:

cost_per_cut =1

metal_price =10

lengths = [26,103, 59]

return: 1770

这本书是如何解决这个问题的,最佳长度的杆是6.因此我们从第一根杆上切下4根长度为6的长度,并从中扔出2根长度的长度。接下来我们从第2个杆上切下17个长度为6的长度,然后扔掉长度为1的一块,第三个,我们剪下9个长度为6的长度,然后扔掉一块长度为5.所以总共做了30次切割。因此,30 * 6 * 10 - 30 * 1 - 1770

到目前为止,这是我的尝试:

def  maxProfit( cost_per_cut,  metal_price,  lengths):

     profit =0
     for num in lengths:

我只是不确定如何去做这件事。我应该迭代这些数字,看看它们可被整除的最低数字并使用它吗?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

由于输入范围非常小,你不能只是强行这个

    static int getProfit(int[] rods, int cutCost, int metalPrice, int L)
    {
        int profit = 0;
        foreach (int rod in rods)
        {
            if (rod % L == 0)
            {
                profit += (metalPrice * rod - (rod / L - 1) * cutCost);
            }
            else
            {
                profit += (metalPrice * (rod - rod % L) - (rod / L) * cutCost);
            }
        }
        return profit;
    }

    static void Main(string[] args)
    {
        int[] rods = new int[] { 26,103,59};
        int cutCost =1;
        int metalPrice=10;
        int maxProfit = 0;
        for (int L = 1; L <= 10000; ++L)
        {
            int profit= getProfit(rods, cutCost, metalPrice, L);
            if (profit > maxProfit)
            {
                maxProfit = profit;
            }
        }
        Console.WriteLine(maxProfit);
    }

答案 1 :(得分:1)

虽然@JasonL提供的算法适当地回答了这个问题,但我认为仅仅因为元素的长度在[1,1000]的范围内,我们不一定从1开始并且一直到1000。

以你的情况为例:

lengths = [26,103, 59]

理想的情况是,如果这些数字的最小,即26也是103和59的因子。我们不会浪费任何长度并获得最大利润。

所以在你的算法中,你应该做的第一次检查。现在,如果最小的数字不分割其他两个数字。只需循环通过最大数字直到1.正如@ user3386109正确指出的那样,并不一定要包含最小的一个,但最大的应该,因为我们在这里最大化利润。

因此,在您的情况下,如果您只是从[1,103]检查并找到这些数字的最大倍数小于或等于26,103,59而不是从[1,1000]检查,并适当地计算利润。你应该有最大的利润。

该算法的时间复杂度 - &gt; O(max(lengths)*size(lengths)) 其中lengths是数组[26,103, 59]max()是该数组的最大元素,size()表示该数组的长度阵列。

希望它能让你开始朝着正确的方向前进。