腾讯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)

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

posted @ 2020-08-23 16:31  Andy_George  阅读(132)  评论(0编辑  收藏  举报