題目描述:
小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。
輸入描述:
每個輸入包含乙個測試用例
每個測試的第一行包含乙個整數,表示歌單的總長度k(1<=k<=1000).
接下來的一行包含四個正整數,分別表示歌的第一種長度a(a<=10)和數量x(x<=100)以及歌的第二種長度b(b<=10)和數 量y(y<=100).保證a不等於b。
輸出描述:
輸出乙個整數,表示組成歌單的方法取模。因為答案可能會很大,輸出對1000000007取模的結果
輸入示例:
52 3 3 3
輸出示例:
9分析:這道題比較好的處理方法也最容易理解的是用組合數來求解,說到組合數就很容易想到這道題和我們高中做的從兩個盒子裡取小球的排列組合題。
此題可以轉換為這樣一道數學題,有兩個盒子,乙個盒子裡裝有3個紅球,乙個盒子裡裝有3個白球,紅球代表2分,白球代表3分,則從兩個盒子中任意拿球使其分數等於9的拿法有多少種。
這樣就會想如果拿了0個紅球,白球有多少種拿法,如果拿了1個、2個、3個紅球,白球各有多少種拿法。
再者,將球的數量和球的分數換成未知的量:即有兩個盒子,乙個盒子裡裝有x個紅球,乙個盒子裡裝有y個白球,紅球代表a分,白球代表b分,則從兩個盒子中任意拿球使其分數等於k的拿法有多少種。很顯然就和面試題一樣了,可以想到假設拿了 i 個紅球( i <= x),需要滿足條件( i * a <= k : 分數不能超過k)&&(( k - i* a)% b == 0 :確保分數相加等於k) && (( k - i* a)/ b <= y :不能超過白球的數目),將滿足條件的結果相加起來就是最後的結果。
而當滿足條件後從各自的盒子裡拿球就有不同的拿法,是很典型的排列組合問題,對於這道題我們可以建乙個二維陣列來存這些組合數,行標代表排列組合公式的下標,列標代表排列組合公式的上標,具體的存法和楊輝三角有些類似,可以直接看**:
#include long long c[105][105];
const int mod = 1000000007;
void init() //計算組合數
}int main()
} printf("%lld\n",ans);
return 0;
}
執行結果如下所示:
騰訊筆試 小Q的歌單
時間限制 1秒 空間限制 32768k 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單 現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙...
C 程式設計 小Q的歌單(騰訊模擬筆試題)
程式設計題 小q的歌單 這題事後搞了很久,主要是要考慮時間複雜度的問題,常規的思路是可以行通的,但是通不過所有的用例,用例範圍一旦很大,就會超出運算時間,導致程式不通過。在沒考慮楊輝三角的時候,僅通過60 的測試用例。題目描述 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌...
騰訊2018秋招筆試真題 小Q的歌單
題目描述 小 q 有 x 首長度為 a 的不同的歌和 y 首長度為 b 的不同的歌,現在小 q 想用這些歌組成乙個 總長度正好為 k 的歌單,每首歌最多只能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含...