SXF2019长方体的摆放

一个长方体,长宽高分别为x,y,z,都为自然数。
现在要把若干个相同的长方体摆成高为N的一根柱形体。
每层摆1个,如果两种摆法的高度是一样的,则认为这两种摆法等价,所以每层只有三种摆法。
求一共有多少种摆法。

输入描述:
第一行为一个数字N,N>=1且N<=100,表示要摆放的高度
第二行为长方体的长宽高,x、y、z都为无符号整数,按升序排列。

输出描述:
摆法总数,已知该总数会小于10000000

输入例子1:
10
5 6 7

输出例子1:
1

用dp[i]表示使用i个长方体达到高度j摆放的总数, 那么dp[i][j]可以由三个部分组成

dp[i][j] += dp[i-1][j-a]
dp[i][j] += dp[i-1][j-b]
dp[i][j] += dp[i-1][j-c]

由这三部分相加得到,而我们最终要求的和高度有关,而和用了多少长方体无关,所以把所有高度为n的情况加起来即可;

while True:
    try:
        n = int(input())
        a, b, c = list(map(int, input().split()))
        max_layer = int(n // min(a, b, c))
        dp = [[0] * (n + 1) for i in range(max_layer + 1)]
        dp[0][0] = 1
        for i in range(1,len(dp)):
            for j in range(len(dp[0])):
                if j - a >=0:
                    dp[i][j] += dp[i-1][j-a]
                if j - b >=0:
                    dp[i][j] += dp[i-1][j-b]
                if j - c >=0:
                    dp[i][j] += dp[i-1][j-c]

        result = 0
        for line in dp:
            result += line[n]
        print(result)

    except:
        break

你可能感兴趣的:(LeetCode)