【问题标题】:find locations in rod cutting problem[Microsoft interview]在棒材切割问题中寻找位置[微软采访]
【发布时间】:2020-05-04 17:38:21
【问题描述】:

给定一根长度为 n 英寸的棒和一个价格数组,其中包含所有尺寸小于 n 的块的价格。确定要进行削减以实现最大利润的位置。

我需要帮助我们如何解决这个问题?

【问题讨论】:

  • 任何示例测试用例?
  • 这只是knapsack problem,用长度代替重量,用价格来代表价值。

标签: algorithm dynamic-programming


【解决方案1】:

一个简单的递归就可以解决这个问题:

#include <algorithm>
#include <climits>

int maxPrice(int prices[], int n) { 
   if (n <= 0) return 0; 
   int ans = INT_MIN; 

   for (int i = 0; i < n; i++) 
         ans = std::max(ans, prices[i] + maxPrice(prices, n - i - 1)); 

   return ans; 
} 

int main(){
    //size:         1  2  3  4  5   6   7   8
    int prices[] = {1, 3, 4, 8, 9, 11, 11, 16};
    std::cout<<maxPrice(prices, 8)<<std::endl;
    return 0;
}

另一方面,这个解决方案很慢。最好的选择是采用背包问题方法:假设您有一个大小为 n 的背包,并且每件大小(或在这种情况下为重量)i 成本 p[i],然后像普通背包一样填充矩阵。我们的想法是预处理每个尺寸的最优惠价格,直到 n

【讨论】:

  • 前两行可能是你在面试中写的最糟糕的东西。见stackoverflow.com/q/31816095/9254539
  • 问题是关于算法,而不是包含和命名空间。您对算法或我的 cmets 有任何考虑吗?我不认为你在判断答案的要点。
  • 这不是你回答的重点,但是很多看到这个的人不会知道更多,会认为#include &lt;bits/stdc++.h&gt;是正确的方法。已经有足够多的糟糕的 C++ 教师教授糟糕的实践。写两个合适的标准库#include 行真的那么难吗?
  • 不,但是如果解释的重点不是关于包含而是算法的逻辑,那么一般的包含行会更容易。我很确定询问算法的人不会介意我使用的算法。无论如何,请随时编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
相关资源
最近更新 更多