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

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

題目:spa

小Q有X首長度爲A的不一樣的歌和Y首長度爲B的不一樣的歌,如今小Q想用這些歌組成一個總長度正好爲K的歌單,每首歌最多隻能在歌單中出現一次,在不考慮歌單內歌曲的前後順序的狀況下,請問有多少種組成歌單的方法。code

輸出描述:blog

輸出一個整數,表示組成歌單的方法取模。由於答案可能會很是大,因此輸出對1000000007取模的結果。utf-8

輸入示例:get

5input

2 3 3 3it

輸出示例:io

9class

解題方法:

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

# -*- 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)

 

 

方法2、動態規劃。

代碼以下:

# -*- 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)
相關文章
相關標籤/搜索