算法題14 小Q歌單,牛客網,騰訊筆試題


算法題14 小Q歌單,牛客網,騰訊筆試題

題目:

小Q有X首長度為A的不同的歌和Y首長度為B的不同的歌,現在小Q想用這些歌組成一個總長度正好為K的歌單,每首歌最多只能在歌單中出現一次,在不考慮歌單內歌曲的先后順序的情況下,請問有多少種組成歌單的方法。

輸出描述:

輸出一個整數,表示組成歌單的方法取模。因為答案可能會非常大,所以輸出對1000000007取模的結果。

輸入示例:

5

2 3 3 3

輸出示例:

9

解題方法:

方法一、暴力搜索,枚舉其組合數。

# -*- coding:utf-8 -*-
mod = 1000000007
K = int(input())
A, X, B, Y = list(map(int, input().split()))

#獲得階乘的值
def get_factorial(x):
    if x==0 or x==1:
        return 1
    else:
        return x*get_factorial(x-1)

def get_permutation(m,n):
    first=get_factorial(n)
    second=get_factorial(m)
    third=get_factorial(m-n)
    return second//(first*third)

ans = 0

for i in range(X+1):
    for j in range(Y+1):
        if A*i+B*j==K:
            one = get_permutation(X, i)
            two = get_permutation(Y, j)
            ans += (one*two) % mod
print(ans%mod)

 

 

方法二、動態規划。

代碼如下:

# -*- coding:utf-8 -*-
mod = 1000000007
K = int(input())
A, X, B, Y = list(map(int, input().split()))
 
arr = [[0 for i in range(101)] for j in range(101)]
arr[0][0] = 1
for i in range(1,101):
    arr[i][0] = 1
    for j in range(1,101):
        arr[i][j] = (arr[i-1][j-1]+arr[i-1][j]) % mod
 
ans = 0
for i in range(X+1):
    if (i*A <= K and (K-A*i) % B == 0 and (K-A*i)//B <= Y):
        ans = (ans +(arr[X][i]*arr[Y][(K-A*i)//B]) % mod) % mod
print(ans)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM