📜  长度为 a、b 和 c 的段的最大数量

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

给定一个正整数 N,找出可以从 N 形成的长度为 a、b 和 c 的段的最大数量。
例子 :

Input : N = 7, a = 5, b, = 2, c = 5 
Output : 2 
N can be divided into 2 segments of lengths
2 and 5. For the second example,

Input : N = 17, a = 2, b = 1, c = 3 
Output : 17 
N can be divided into 17 segments of 1 or 8 
segments of 2 and 1 segment of 1. But 17 segments
of 1 is greater than 9 segments of 2 and 1.  

方法:使用的方法是动态规划。基础 dp 0将为 0,因为它最初没有段。之后,从 1 到 n 迭代,对于 dp i+a 、dp i+b和 dp i+c 3 个状态中的每一个,存储通过使用或不使用 a、b 或 c 获得的最大值部分。
要处理的 3 个状态是:

以下是上述想法的实现:

C++
// C++ implementation to divide N into
// maximum number of segments
// of length a, b and c
#include 
using namespace std;
 
// function to find the maximum
// number of segments
int maximumSegments(int n, int a,
                    int b, int c)
{
    // stores the maximum number of
    // segments each index can have
    int dp[n + 1];
     
    // initialize with -1
    memset(dp, -1, sizeof(dp));
 
    // 0th index will have 0 segments
    // base case
    dp[0] = 0;
 
    // traverse for all possible
    // segments till n
    for (int i = 0; i < n; i++)
    {
        if (dp[i] != -1) {
             
            // conditions
        if(i + a <= n )    //avoid buffer overflow
                dp[i + a] = max(dp[i] + 1,
                            dp[i + a]);
                             
        if(i + b <= n ) //avoid buffer overflow
                dp[i + b] = max(dp[i] + 1,
                            dp[i + b]);
                             
        if(i + c <= n )    //avoid buffer overflow
                dp[i + c] = max(dp[i] + 1,
                            dp[i + c]);
        }
    }
    return dp[n];
}
 
// Driver code
int main()
{
    int n = 7, a = 5, b = 2, c = 5;
    cout << maximumSegments(n, a, b, c);
    return 0;
}


Java
// Java implementation to divide N into
// maximum number of segments
// of length a, b and c
import java.util.*;
 
class GFG
{
     
    // function to find the maximum
    // number of segments
    static int maximumSegments(int n, int a,
                            int b, int c)
    {
        // stores the maximum number of
        // segments each index can have
        int dp[] = new int[n + 10];
 
        // initialize with -1
        Arrays.fill(dp, -1);
 
        // 0th index will have 0 segments
        // base case
        dp[0] = 0;
 
        // traverse for all possible
        // segments till n
        for (int i = 0; i < n; i++)
        {
            if (dp[i] != -1)
            {
 
                // conditions
                if(i + a <= n )    //avoid buffer overflow
                dp[i + a] = Math.max(dp[i] + 1,
                                    dp[i + a]);
                                     
                if(i + b <= n )    //avoid buffer overflow
                dp[i + b] = Math.max(dp[i] + 1,    
                                    dp[i + b]);
                                     
                if(i + c <= n )    //avoid buffer overflow
                dp[i + c] = Math.max(dp[i] + 1,
                                    dp[i + c]);
            }
        }
        return dp[n];
    }
 
    // Driver code
    public static void main(String arg[])
    {
        int n = 7, a = 5, b = 2, c = 5;
        System.out.print(maximumSegments(n, a, b, c));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python implementation
# to divide N into maximum
# number of segments of
# length a, b and c
 
# function to find
# the maximum number
# of segments
def maximumSegments(n, a, b, c) :
 
    # stores the maximum
    # number of segments
    # each index can have
    dp = [-1] * (n + 10)
 
    # 0th index will have
    # 0 segments base case
    dp[0] = 0
 
    # traverse for all possible
    # segments till n
    for i in range(0, n) :
     
        if (dp[i] != -1) :
         
            # conditions
            if(i + a <= n ): # avoid buffer overflow   
                dp[i + a] = max(dp[i] + 1,
                            dp[i + a])
                             
            if(i + b <= n ): # avoid buffer overflow   
                dp[i + b] = max(dp[i] + 1,
                            dp[i + b])
                             
            if(i + c <= n ): # avoid buffer overflow   
                dp[i + c] = max(dp[i] + 1,
                            dp[i + c])
 
    return dp[n]
 
# Driver code
n = 7
a = 5
b = 2
c = 5
print (maximumSegments(n, a,
                    b, c))
 
# This code is contributed by
# Manish Shaw(manishshaw1)


C#
// C# implementation to divide N into
// maximum number of segments
// of length a, b and c
using System;
 
class GFG
{
     
    // function to find the maximum
    // number of segments
    static int maximumSegments(int n, int a,
                            int b, int c)
    {
        // stores the maximum number of
        // segments each index can have
        int []dp = new int[n + 10];
 
        // initialize with -1
        for(int i = 0; i < n + 10; i++)
        dp[i]= -1;
         
 
        // 0th index will have 0 segments
        // base case
        dp[0] = 0;
 
        // traverse for all possible
        // segments till n
        for (int i = 0; i < n; i++)
        {
            if (dp[i] != -1)
            {
 
                // conditions
                if(i + a <= n )    // avoid buffer overflow
                dp[i + a] = Math.Max(dp[i] + 1,
                                    dp[i + a]);
                                     
                if(i + b <= n )    // avoid buffer overflow
                dp[i + b] = Math.Max(dp[i] + 1,
                                    dp[i + b]);
                                     
                if(i + c <= n )    // avoid buffer overflow
                dp[i + c] = Math.Max(dp[i] + 1,
                                    dp[i + c]);
            }
        }
        return dp[n];
    }
 
    // Driver code
    public static void Main()
    {
        int n = 7, a = 5, b = 2, c = 5;
        Console.Write(maximumSegments(n, a, b, c));
    }
}
 
// This code is contributed by nitin mittal


PHP


Javascript


输出 :

2

时间复杂度:O(n)

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