arrays - 具有给定总和的子数组计数,使得索引按升序排列
问题描述
给定一个数组,计算具有给定总和的子数组的数量,使得索引按升序排列(它们不需要连续,但数组元素的索引应该按升序排列。)
例如 - Array - {1 2 3 4 5}, Sum - 5 那么 {1,4} 也是一个有效的子数组,因为索引按升序排列 (1 < 4)。其他是 {2,3} 等。
注意 - 这个问题似乎与子数组计数的问题非常相似,但是当索引按升序排列时它变得更加复杂,因为那时会有更多的值。我要求有人分享一个相同的伪代码,如果不可能,分享逻辑。
解决方案
这个问题相当于计算总和为 的子序列的数量sum
。只要你没有重复的索引,说索引必须上升并不意味着什么。然后可以使用背包式动态规划方法来解决问题。
定义dp[N+1][sum+1]
以存储dp[i][j]
数组的子序列数,直到(但不包括)i
总和为 的索引j
。Python代码如下:
N = 10
sum = 10
arr = [1,2,3,4,5,1,2,3,4,5]
dp = [[0 for x in range(sum+1)] for x in range(N+1)]
dp[0][0] = 1 # base case; one way to achieve a sum of 0 taking 0 elements
for i in range(N):
for j in range(sum+1):
if j + arr[i] <= sum:
dp[i+1][j+arr[i]] += dp[i][j]
dp[i+1][j] += dp[i][j]
print dp[N][sum]
推荐阅读
- scala - 需要以制表符分隔的形式获取数组元素
- javascript - 获得两个不同的日期月份
- c++ - sizeof(function) 有意义吗?
- html - 媒体查询未从 479px 到 767px 的宽度读取?
- python - 在 Python 中通过自省向模块动态添加函数
- android - firebase 与 android Instantapp 的集成
- python - **args 和 *kwargs 错误
- python - 正则表达式删除破折号后的 0
- javascript - 如何使 JavaScript 代码使用 ES6 工作?
- javascript - 我怎样才能使这个 Keyfunction 和 onload 函数工作?