题目
数码城市有土地出售。待售的土地被划分成若干块,每一块标有一个价格。这里假设每块土地只有两块相邻的土地,除了开头和结尾的两块是只有一块邻居的。每位客户可以购买多块连续相邻的土地。
现给定这一系列土地的标价,请你编写程序,根据客户手头的现金量,告诉客户有多少种不同的购买方案。
输入格式:
输入首先在第一行给出两个正整数:N(≤10
4
)为土地分割的块数(于是这些块从 1 到 N 顺次编号);M(≤10
9
)为客户手中的现金量。
随后一行给出 N 个正整数,其中第 i 个数字就是第 i 块土地的标价。
题目保证所有土地的总价不超过 10
9
。
输出格式:
在一行中输出客户有多少种不同的购买方案。请注意客户只能购买连续相邻的土地。
输入样例:
5 85
38 42 15 24 9
结尾无空行
输出样例:
11
结尾无空行
样例解释:
这 11 种不同的方案为:
38
42
15
24
9
38 42
42 15
42 15 24
15 24
15 24 9
24 9
解题思路
N, maxZijin = map(int, input().split())
inputList = list(map(int, input().split()))
# N, maxZijin = map(int, "5 85".split())
# inputList = list(map(int, "38 42 15 24 9".split()))
ans = []
def dfs(idx:int, cur:int, patch:[int]):
#递归结束
if cur <= 0:
# ans.append(patch[:])
return
elif idx == len(inputList):
return
if cur >= inputList[idx]:
if len(patch) == 0 or idx==(patch[-1]+1):
# print(idx, cur, patch,inputList[idx])
# print(idx, cur, patch)
# and (idx == (patch[-1] + 1))
patch.append(idx)
ans.append(patch[:])
dfs(idx+1, cur - inputList[idx] ,patch)
# return
#消除影响【重要】
patch.pop()
dfs(idx + 1, cur, patch)
dfs(0,maxZijin,[])
print(len(ans))
网友评论