腾讯2018春招技术类-小Q的歌单
小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取模的结果。
输入例子1:
5
2 3 3 3
输出例子1:
9
参考1:
这就是01背包的求解方案数的模板题:https://blog.csdn.net/xpy870663266/article/details/103197578
s = int(input()) v1, n1, v2, n2 = list(map(int, input().strip().split(" "))) v = [v1] * n1 + [v2] * n2 n = n1 + n2 dp = [0] * (s + 1) dp[0] = 1 for i in range(n): for j in range(s, v[i] - 1, -1): dp[j] = (dp[j] + dp[j - v[i]]) print(dp[s]% 1000000007)
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
参考2:
01背包求方案数问题。x+y个物品,求背包刚好装满的装法。
k = int(input().strip()) lx, x, ly, y = list(map(int, input().strip().split(" "))) dp = [1] + [0] * k # 第一位初始化为1 for i in range(x): for j in range(k, lx-1, -1): dp[j] += dp[j-lx] for i in range(y): for j in range(k, ly-1, -ly): # 第二次步长为ly dp[j] += dp[j-ly] print(dp[k]%1000000007)
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例