【问题标题】:Efficient Algorithm for this simple game [closed]这个简单游戏的高效算法[关闭]
【发布时间】:2015-10-16 14:02:42
【问题描述】:

我们有 N 个类型 1 的硬币和 M 个类型 2 的硬币。一个游戏板有 N 个类型 1 的方格和 M 个类型 2 的方格。在这个游戏中,我们必须在每个方格中投入一枚硬币。放置所有硬币后,我们将根据我们的硬币放置策略获得分数。

如果类型 1 方块包含类型 1 硬币,那么我们将获得 A 分,如果类型 2 方块包含类型 2 硬币,那么我们将获得 B 分,在所有其他情况下,我们将获得 C 分。我们的游戏总得分将是所有方格得分的总和。

可用的用户输入是 (N,M,A,B,C)

我们怎样才能最大化我们的分数?

例如,如果 N=3 M=4 A=500 B=800 C=600

在最优策略下,我们将 3 个类型 1 的硬币放入 3 个类型 1 的方格中,得分 =500+500+500 = 1500,我们将 4 种类型的硬币放入 4 个类型 2 的方格中分数 =800+800+800+800 = 3200 所以总分是 1500+3200 = 4700

【问题讨论】:

  • SO 不是免费的编码服务。编写程序来做,如果你不能让它工作,把你尝试过的贴在这里,我们会帮你解决问题。
  • @Cyber​​Drone One 通常会最大化成本、数量、时间(以秒为单位)等数字。但是你试图最大化像 4A+6B+4C 这样的总和,这是没有意义的。给 A、B、C 赋值,或者至少告诉 A>B>C、N>M。你明白我的意思吗?
  • 我对编码比较陌生,我只是想在实现它之前找出一个合适的算法。我不是在寻找实际的代码,我只需要开发算法的帮助。它会是如果有人可以帮助我解决逻辑,那就太好了
  • @Cyber​​Drone 这个问题还是很模糊的,因为我们甚至不知道游戏板的图案是什么,n(type-1) 和 m(type-2) 是怎样的放置的方块。如果我们可以区分类型 1 正方形和类型 2 正方形(也可以区分硬币类型),那么我们就可以基于两个变量的纯线性方程(参见 LPP:en.wikipedia.org/wiki/Linear_programming)以给定的目标函数作为我们的总分。
  • 我们可以认为类型 1 的正方形和硬币是红色的,类型 2 的正方形和硬币是蓝色的。正方形的空间排列对这个问题没有意义,所以我们可以假设任何正方形的排列。

标签: c algorithm optimization


【解决方案1】:

这很简单。一种明显有效的解决方案是将所有类型 1 硬币放在类型 1 方格上。这会给你一定的分数。我们现在可以用 2 型硬币交换任何 1 型硬币。这样做,我们将失去A + B 的分数,但获得2 C。所以,交换只有在2 C > A + B 时才有意义。我们可以交换min(N, M) 次。所以最高分是:

nSwaps =  
    if 2 * C > A + B then
        min(N, M)
    else
        0
    end if

maxScore = N * A + M * B + nSwaps * (2 * C - A - B)

【讨论】:

  • 非常感谢。这是一个非常好的解决方案。我尝试使用动态编程来解决它,但找不到重叠的子结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2022-12-09
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多