輸入描述:
每個輸入包含乙個測試用例。輸出描述:每個測試用例的第一行包含乙個整數,表示歌單的總長度k(1<=k<=1000)。
接下來的一行包含四個正整數,分別表示歌的第一種長度a(a<=10)和數量x(x<=100)以及歌的第二種長度b(b<=10)和數量y(y<=100)。保證a不等於b。
輸出乙個整數,表示組成歌單的方法取模。因為答案可能會很大,輸出對1000000007取模的結果。示例1
52 3 3 3
9解決思路:
1. 用陣列dp來儲存結果,dp[i][j]表示用前j首歌表示長度為i的歌單的方法數,i=1…k,j=1,…,na+nb。na是第1種歌的數量,nb是第2種歌的數量
2. lens[j]表示第j首歌的長度,如果i>=lens[j],那麼由前j首歌組成長度為i的歌單的方法數可分為兩部分,第一部分是dp[i][j-1],即由前j-1首歌組成長度
為i的歌單的方法數,第二部分是dp[i-lens[j]][j-1],即由j-1首歌組成長度為i-lens[j]的歌單的方法數,因為第j首歌已經佔據了lens[j]的長度。
3. 如果i
ns[j
]'>i][j]
'>[i][j]
[i][j]等於dp[i]
[j−1
]'>[i][j−1]
[i][j−1]。
**:
#include #include#include
#include
#include
#include
using
namespace
std;
const
int mod =1000000007
;int
k;int
a,x,b,y;
int dp[1010][210
];int len[210
];int
main()
else
}cout
return0;
}
小Q的歌單(2)
小q有x首長為a的不同的歌和長為y首長度為b的不同的歌,從種選取任意首,組成長度為k的歌單,每首歌只能被選取一次,不考慮歌單內歌曲的先後順序,問有多少種組成方法。第一行是乙個整數,表示歌單的總長度為k。第二行有四個整數,a 10 x 100 b 10 y 100 分別代表第一種長度和數量,第二種長度...
騰訊筆試 小Q的歌單
時間限制 1秒 空間限制 32768k 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單 現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙...
騰訊筆試題 小Q的歌單
題目描述 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例 每個測試的第一行包含乙個整數,表示歌單的總長度k 1 ...