【问题标题】:objective-c looking for algorithmObjective-c 寻找算法
【发布时间】:2014-01-25 02:38:32
【问题描述】:

在我的应用程序中,我需要确定用户可以在杠铃上加载哪些板以达到所需的重量。

例如,用户可能会指定他们正在使用 45 磅的酒吧并使用 45、35、25、10、5、2.5 磅的盘子。对于像 115 这样的重量,这是一个很容易解决的问题,因为结果与普通盘子完全匹配。 115 - 45 / 2 = 35。

所以这里的目标是找到用户需要达到重量的最大到最小的板(从选择中)。

我的启动方法看起来像这样...

 -(void)imperialNonOlympic:(float)barbellWeight workingWeight:(float)workingWeight {
     float realWeight = (workingWeight - barbellWeight);
     float perSide = realWeight / 2;

     .... // lots of inefficient mod and division ....
 }

我的思考过程是首先确定每边的重量是多少。总重量 - 杠铃的重量 / 2。然后确定所需的最大到最小的盘子是多少(以及每个的数量,例如 325 将是 45 * 3 + 5 或 45、45、45、5。

搞砸了 fmodf 和其他一些想法,我想到可能有一种算法可以解决这个问题。我正在研究 BFS,并承认它在我的头上,但仍然愿意试一试。

了解有关在哪里查看算法或代码示例的任何提示。

【问题讨论】:

  • 您不需要算法,因为您已经有了算法。做起来很简单,只用最大的重量,直到剩下的小于那个,然后继续下去,用5个点的重量结束。
  • @JamesBlack 这不起作用。这是一个最小硬币问题(使用 DP 解决)。您不能按照您所说的程序进行操作,例如,假设所需的总重量 = 123,而目前的重量是 50,41,1。根据您的解决方案,您将有 123 = 50*2+23*1,(共 25 项),但 123 = 41*3,3 是最好的解决方案。您必须使用动态编程来获得它。 stackoverflow.com/questions/4247662/…
  • 塔内克,桑图。这很好地描述了问题,你的链接让我开始解决它。

标签: ios objective-c algorithm


【解决方案1】:

您的问题称为Knapsack problem。你会找到很多解决这个问题的方法。这个问题有一些变种。这基本上是一个动态规划 (DP) 问题。

一种常见的方法是,您开始取最大的重量(但小于您想要的重量),然后取最大的剩余重量。这很容易。我正在添加更多链接(Link 1Link 2Link 3)以便清楚。但是有些问题可能很难理解,跳过它们并尝试专注于基本的背包问题。祝你好运.. :)

如果有帮助,请告诉我.. :)

【讨论】:

  • 非常有帮助,非常感谢。
  • 谢谢。你的问题让我想起了过去。有一次我花了很多时间为 ACM ICPC 解决算法问题。现在是一名全职开发人员.. :P 真正有趣的是解决问题.. :)
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多