考虑一种游戏,玩家在移动中可以得分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