📜  将一根长度为 N 的棍棒切成最多 K 个长度的均匀长度的方法数

📅  最后修改于: 2021-09-17 07:09:11             🧑  作者: Mango

给定一根长度为N单位的杆,任务是找到将杆分成几部分的方法的数量,使得每个部分的长度都是偶数,并且每个部分最多是K 个单位。
例子:

方法:想法是使用动态规划,其中最佳子结构是每个部分的长度应该是偶数。通过递归调用切割后获得的一块的函数来计算切割棒的所有方式。
下面是上述方法的实现:

C++14
// C++14 program for the above approach
#include 
using namespace std;
 
// Recursive Function to count
// the total number of ways
int solve(int n, int k, int mod, int dp[])
{
    // Base case if no-solution exist
    if (n < 0)
        return 0;
 
    // Condition if a solution exist
    if (n == 0)
        return 1;
 
    // Check if already calculated
    if (dp[n] != -1)
        return dp[n];
 
    // Initialize counter
    int cnt = 0;
    for (int i = 2; i <= k; i += 2) {
        // Recursive call
        cnt = (cnt % mod
               + solve(n - i, k, mod, dp)
                     % mod)
              % mod;
    }
 
    // Store the answer
    dp[n] = cnt;
 
    // Return the answer
    return cnt;
}
 
// Driver code
int main()
{
 
    const int mod = 1e9 + 7;
    int n = 4, k = 2;
    int dp[n + 1];
    memset(dp, -1, sizeof(dp));
    int ans = solve(n, k, mod, dp);
    cout << ans << '\n';
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Recursive Function to count
// the total number of ways
static int solve(int n, int k, int mod, int dp[])
{
     
    // Base case if no-solution exist
    if (n < 0)
        return 0;
 
    // Condition if a solution exist
    if (n == 0)
        return 1;
 
    // Check if already calculated
    if (dp[n] != -1)
        return dp[n];
 
    // Initialize counter
    int cnt = 0;
    for(int i = 2; i <= k; i += 2)
    {
         
        // Recursive call
        cnt = (cnt % mod + solve(n - i, k, mod,
               dp) % mod) % mod;
    }
 
    // Store the answer
    dp[n] = cnt;
 
    // Return the answer
    return cnt;
}
 
// Driver code
public static void main(String[] args)
{
    int mod = (int)(1e9 + 7);
    int n = 4, k = 2;
     
    int []dp = new int[n + 1];
    for(int i = 0; i < n + 1; i++)
        dp[i] = -1;
         
    int ans = solve(n, k, mod, dp);
     
    System.out.println(ans);
}
}
 
// This code is contributed by Amit Katiyar


Python3
# Python3 program for the above approach
 
# Recursive function to count
# the total number of ways
def solve(n, k, mod, dp):
     
    # Base case if no-solution exist
    if (n < 0):
        return 0
 
    # Condition if a solution exist
    if (n == 0):
        return 1
 
    # Check if already calculated
    if (dp[n] != -1):
        return dp[n]
 
    # Initialize counter
    cnt = 0
    for i in range(2, k + 1, 2):
         
        # Recursive call
        cnt = ((cnt % mod +
                solve(n - i, k, mod, dp) %
                                    mod) % mod)
                                    
    # Store the answer
    dp[n] = cnt
 
    # Return the answer
    return int(cnt)
 
# Driver code
if __name__ == '__main__':
     
    mod = 1e9 + 7
    n = 4
    k = 2
     
    dp = [-1] * (n + 1)
    ans = solve(n, k, mod, dp)
     
    print(ans)
     
# This code is contributed by mohit kumar 29


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Recursive function to count
// the total number of ways
static int solve(int n, int k, int mod, int []dp)
{
     
    // Base case if no-solution exist
    if (n < 0)
        return 0;
 
    // Condition if a solution exist
    if (n == 0)
        return 1;
 
    // Check if already calculated
    if (dp[n] != -1)
        return dp[n];
 
    // Initialize counter
    int cnt = 0;
    for(int i = 2; i <= k; i += 2)
    {
         
        // Recursive call
        cnt = (cnt % mod + solve(n - i, k, mod,
               dp) % mod) % mod;
    }
 
    // Store the answer
    dp[n] = cnt;
 
    // Return the answer
    return cnt;
}
 
// Driver code
public static void Main(String[] args)
{
    int mod = (int)(1e9 + 7);
    int n = 4, k = 2;
     
    int []dp = new int[n + 1];
    for(int i = 0; i < n + 1; i++)
        dp[i] = -1;
         
    int ans = solve(n, k, mod, dp);
     
    Console.WriteLine(ans);
}
}
 
// This code is contributed by Amit Katiyar


Javascript


输出:
1

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