给定两个整数N和K ,任务是找到将N表示为[1,K]范围内的正整数之和的方式总数,其中每个整数可以多次选择。
例子:
Input: N = 8, K = 2
Output: 5
Explanation: All possible ways of representing N as sum of positive integers less than or equal to K are:
- {1, 1, 1, 1, 1, 1, 1, 1}, the sum is 8.
- {2, 1, 1, 1, 1, 1, 1}, the sum is 8.
- {2, 2, 1, 1, 1, 1}, the sum is 8.
- 2, 2, 2, 1, 1}, the sum is 8.
- {2, 2, 2, 2}}, the sum is 8.
Therefore, the total number of ways is 5.
Input: N = 2, K = 2
Output: 2
天真的方法:解决给定问题的最简单方法是生成选择[1,K]范围内的整数的所有可能组合,并计算总和为N的那些组合。
时间复杂度: O(K N )
辅助空间: O(1)
高效方法:以上方法具有重叠子问题和最优子结构。因此,为了进行优化,需要基于以下观察来执行动态编程:
- 考虑到dp [i]将表示i的方式总数存储为[1,K]范围内的整数之和,则状态转换可以定义为:
- 对于i在范围[1,K]和在范围内的每个f] [1,N]
- DP [J]的值等于(DP [J] + DP [J – I]),对于所有j≥我。
请按照以下步骤解决问题:
- 初始化一个数组,例如dp [] ,所有元素都为0 ,以存储所有递归状态。
- 将dp [0]初始化为1 。
- 现在,使用变量i遍历[1,K]范围,并执行以下步骤:
- 遍历范围[1,N],使用变量j,并更新为DP [J] + DP [J – I] DP [j]的值,如果j≥我。
- 完成上述步骤后,打印dp [N]的值作为结果。
下面是上述方法的实现:
Python
# Python program for the above approach
# Function to find the total number of
# ways to represent N as the sum of
# integers over the range [1, K]
def NumberOfways(N, K):
# Initialize a list
dp = [0] * (N + 1)
# Update dp[0] to 1
dp[0] = 1
# Iterate over the range [1, K + 1]
for row in range(1, K + 1):
# Iterate over the range [1, N + 1]
for col in range(1, N + 1):
# If col is greater
# than or equal to row
if (col >= row):
# Update current
# dp[col] state
dp[col] = dp[col] + dp[col - row]
# Return the total number of ways
return(dp[N])
# Driver Code
N = 8
K = 2
print(NumberOfways(N, K))
输出:
5
时间复杂度: O(N * K)
辅助空间: O(N)