什么是C#中的一个好的算法来查找是否存在I,J,K使得某些S的8 * I + J * 12 + K * 15 = S?

时间:2015-11-06 07:42:38

标签: c# asp.net .net algorithm number-theory

我正在制作一款游戏,玩家的分数会以81215的增量上升。因为它是一个可以(并且过去一直)被攻击的JavaScript游戏,所以我需要在将分数提交到数据库之前进行一些服务器端验证。

例如,得分3830=2*15+1*8开始就有意义,但得分37却没有。比如说,912301283 ....好吧,我不确定,因为我的大脑不足以计算出来。

换句话说,我希望找出一种非暴力的填充方式

private static bool scoreAddsUp ( int score, int [] incs )
{
   // ...
}

在这种情况下incs = { 8, 12, 15 },但当然如果我改变分数增加的方式,我会很好地概括这个过程。

重要问题:

  • 您是否有任何关于如何从头开始编写算法的建议呢?
  • .NET库是否有任何可能对此问题有用的功能?
  • 考虑到数字81215被我任意选择,我可以使用更好的数字进行此程序吗?使用素数(如7913)是否可以让我创建更有效的算法?

2 个答案:

答案 0 :(得分:0)

您可以使用动态编程

private static Boolean ScoreAddsUp(int score, int[] incs) {
  HashSet<int> completed = new HashSet<int>();

  List<int> frontier = new List<int>() {
    0
  };

  while (frontier.Any(item => item <= score)) {
    for (int i = frontier.Count - 1; i >= 0; --i) {
      int front = frontier[i];

      frontier.RemoveAt(i);
      completed.Add(front);

      foreach (int inc in incs) {
        int item = front + inc;

        if (item == score)
          return true;

        if (completed.Contains(item))
          continue;

        frontier.Add(item);
      }
    }
  }

  return false;
}

// Tests
if (!ScoreAddsUp(29, new int[] { 8, 12, 15 }))
  Console.Write("Not Found");

if (ScoreAddsUp(28, new int[] { 8, 12, 15 }))
  Console.Write("Found");

答案 1 :(得分:-3)

试试这个:

if (((score % incs[2]) % incs[1]) % incs[0] == 0)
{
    //remining value is 0, correct score
}
else
{
    //remining value is not 0, incorrect score
}

但是你应该测试它以确保没有误报的答案