资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定一个数组a[1..n],请从中选出若干个数,使得他们的和为X
输入格式
输入第一行包含两个整数n和X
第二行包含n个整数,分别表示a[1],a[2],...,a[n]
输出格式
输出有多少种选法
样例输入
5 4
1 1 1 1 2
样例输出
7
数据规模和约定
n不超过20,X和a[i]不超过30
解法:先对列表进行排序,再使用深度优先加回溯的思想进行解题,一开始想着先对列表进行遍历找到其中等于X的值并忽略大于X的值,但测试结果只得了90分,应该是测试的列表数字中有0和X,这导致情况少了。
于是我直接把排除那步删除,直接对列表进行遍历,运行速度反而更快!!(泪目)下文是AC代码。
# 深度优先搜索算法
def dfs(x, sum):
global ans
if sum == 0: # 递归终点
ans += 1
return
for i in range(len(x)):
if sum - x[i] >= 0:
sum -= x[i]
dfs(x[i + 1:], sum) # 由于前面对列表的排序可以忽略入栈的过程,直接取后面的值进行递归
sum += x[i] # 回溯
n, k = list(map(int, input().split()))
lis = list(map(int, input().split()))
lis.sort() # 在该处排序,确保次数为从小到大,防止测试时出现中间的值大于前面而忽略了前面的值也能与后面的值形成组合
ans = 0
dfs(lis, k)
print(ans)