📜  计算在游戏中达到给定分数的方法数

📅  最后修改于: 2021-09-22 10:18:38             🧑  作者: Mango

考虑一个游戏,玩家可以在一次移动中获得 3、5 或 10 分。给定总分 n,找出达到给定分数的方法数。
例子:

Input: n = 20
Output: 4
There are following 4 ways to reach 20
(10, 10)
(5, 5, 10)
(5, 5, 5, 5)
(3, 3, 3, 3, 3, 5)

Input: n = 13
Output: 2
There are following 2 ways to reach 13
(3, 5, 5)
(3, 10)

这个问题是硬币找零问题的一种变体,可以在 O(n) 时间和 O(n) 辅助空间中解决。
这个想法是创建一个大小为 n+1 的表来存储从 0 到 n 的所有分数的计数。对于每个可能的移动(3、5 和 10),增加表中的值。

C++
// A C++ program to count number of
// possible ways to a given score
// can be reached in a game where a
// move can earn 3 or 5 or 10
#include 
using namespace std;
 
// Returns number of ways
// to reach score n
int count(int n)
{
    // table[i] will store count
    // of solutions for value i.
    int table[n + 1], i;
 
    // Initialize all table
    // values as 0
    for(int j = 0; j < n + 1; j++)
            table[j] = 0;
 
    // Base case (If given value is 0)
    table[0] = 1;
 
    // One by one consider given 3 moves
    // and update the table[] values after
    // the index greater than or equal to
    // the value of the picked move
    for (i = 3; i <= n; i++)
    table[i] += table[i - 3];
     
    for (i = 5; i <= n; i++)
    table[i] += table[i - 5];
     
    for (i = 10; i <= n; i++)
    table[i] += table[i - 10];
 
    return table[n];
}
 
// Driver Code
int main(void)
{
    int n = 20;
    cout << "Count for " << n
         << " is " << count(n) << endl;
 
    n = 13;
    cout <<"Count for "<< n<< " is "
         << count(n) << endl;
    return 0;
}
 
// This code is contributed
// by Shivi_Aggarwal


C
// A C program to count number of possible ways to a given score
// can be reached in a game where a move can earn 3 or 5 or 10
#include 
 
// Returns number of ways to reach score n
int count(int n)
{
    // table[i] will store count of solutions for
    // value i.
    int table[n+1], i;
 
    // Initialize all table values as 0
    memset(table, 0, sizeof(table));
 
    // Base case (If given value is 0)
    table[0] = 1;
 
    // One by one consider given 3 moves and update the table[]
    // values after the index greater than or equal to the
    // value of the picked move
    for (i=3; i<=n; i++)
       table[i] += table[i-3];
    for (i=5; i<=n; i++)
       table[i] += table[i-5];
    for (i=10; i<=n; i++)
       table[i] += table[i-10];
 
    return table[n];
}
 
 
// Driver program
int main(void)
{
    int n = 20;
    printf("Count for %d is %d\n", n, count(n));
 
    n = 13;
    printf("Count for %d is %d", n, count(n));
    return 0;
}


Java
// Java program to count number of
// possible ways to a given score
// can be reached in a game where
// a move can earn 3 or 5 or 10
import java.util.Arrays;
 
class GFG
{
    // Returns number of ways to reach score n
    static int count(int n)
    {
        // table[i] will store count of solutions for
        // value i.
        int table[] = new int[n + 1], i;
     
        // Initialize all table values as 0
        Arrays.fill(table, 0);
     
        // Base case (If given value is 0)
        table[0] = 1;
     
        // One by one consider given 3
        // moves and update the table[]
        // values after the index greater
        // than or equal to the value of
        // the picked move
        for (i = 3; i <= n; i++)
            table[i] += table[i - 3];
        for (i = 5; i <= n; i++)
            table[i] += table[i - 5];
        for (i = 10; i <= n; i++)
            table[i] += table[i - 10];
     
        return table[n];
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int n = 20;
        System.out.println("Count for "+n+" is "+count(n));
     
        n = 13;
        System.out.println("Count for "+n+" is "+count(n));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python program to count number of possible ways to a given
# score can be reached in a game where a move can earn 3 or
# 5 or 10.
 
# Returns number of ways to reach score n.
def count(n):
 
    # table[i] will store count of solutions for value i.
    # Initialize all table values as 0.
    table = [0 for i in range(n+1)]
 
    # Base case (If given value is 0)
    table[0] = 1
 
    # One by one consider given 3 moves and update the
    # table[] values after the index greater than or equal
    # to the value of the picked move.
    for i in range(3, n+1):
        table[i] += table[i-3]
    for i in range(5, n+1):
        table[i] += table[i-5]
    for i in range(10, n+1):
        table[i] += table[i-10]
 
    return table[n]
 
# Driver Program
n = 20
print('Count for', n, 'is', count(n))
 
n = 13
print('Count for', n, 'is', count(n))
 
# This code is contributed by Soumen Ghosh


C#
// C# program to count number of
// possible ways to a given score
// can be reached in a game where
// a move can earn 3 or 5 or 10
using System;
 
class GFG {
     
    // Returns number of ways to reach
    // score n
    static int count(int n)
    {
         
        // table[i] will store count
        // of solutions for value i.
        int []table = new int[n + 1];
     
        // Initialize all table values
        // as 0
        for(int j = 0; j < n+1; j++)
            table[j] = 0;
         
        // Base case (If given value is 0)
        table[0] = 1;
     
        // One by one consider given 3
        // moves and update the table[]
        // values after the index greater
        // than or equal to the value of
        // the picked move
        for (int i = 3; i <= n; i++)
            table[i] += table[i - 3];
        for (int i = 5; i <= n; i++)
            table[i] += table[i - 5];
        for (int i = 10; i <= n; i++)
            table[i] += table[i - 10];
     
        return table[n];
    }
     
    // Driver code
    public static void Main ()
    {
        int n = 20;
        Console.WriteLine("Count for "
             + n + " is " + count(n));
     
        n = 13;
        Console.Write("Count for "
            + n + " is " + count(n));
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


输出:

Count for 20 is 4
Count for 13 is 2 

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程