我正在为即将到来的求职面试练习算法,而我无法正确实施此面试。我也试图最大限度地提高效率。这是问题所在:
最大限度地提高销售金属棒的业务利润。如果您销售长度为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:
我只是不确定如何去做这件事。我应该迭代这些数字,看看它们可被整除的最低数字并使用它吗?有什么想法吗?
答案 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()
表示该数组的长度阵列。
希望它能让你开始朝着正确的方向前进。