Recursion 使用(1,…,K)求N的可能和数

Recursion 使用(1,…,K)求N的可能和数,recursion,dynamic-programming,coin-change,Recursion,Dynamic Programming,Coin Change,我有以下问题要解决:给定一个数字N和1这是动态规划中的标准问题(子集和问题) 让我们定义函数f(i,j),它给出了使用数字(1…i)的子集获得和j的方法数,那么问题的结果将是f(k,n)。 对于范围(1…i)中的每个数字x,x可能是和j的一部分,也可能不是,因此我们需要计算这两种可能性。 注意:f(i,0)=1表示任何i,这意味着您可以通过一种方式获得总和=0,这种方式是不从范围(1…i)中取任何数字。 以下是用C++编写的代码: int n=10; int k=7; int f[8][11]

我有以下问题要解决:给定一个数字N和1这是动态规划中的标准问题(子集和问题)

让我们定义函数f(i,j),它给出了使用数字(1…i)的子集获得和j的方法数,那么问题的结果将是f(k,n)。

对于范围(1…i)中的每个数字x,x可能是和j的一部分,也可能不是,因此我们需要计算这两种可能性。

注意:f(i,0)=1表示任何i,这意味着您可以通过一种方式获得总和=0,这种方式是不从范围(1…i)中取任何数字。

以下是用C++编写的代码:


int n=10;
int k=7;
int f[8][11];;
//用零初始化数组

在我的问题中,一个和可以有相等的因子。例如,如果N=3,k=2,(1,1,1)是一个有效的和。这在我的原始问题中没有明确提到,我已经包括在内。好了,子集和问题允许最多使用集合中的每个数字一次,因此它不适用于这里。我刚刚更新了我的答案,允许元素的重复@AlanEvangelista@AlanEvangelista您的反馈非常感谢,因为您的努力程度很低在Python解决方案中添加动态编程是使用
functools
中的
lru\u cache
。以避免排列生成有序排列。您基本上描述了一个硬币更换问题,目标和N以及面额为1,2,3,…,k的硬币。请参见我的例子。
    
def find_num_sums_aux(n, min_k, max_k):
    
    # base case
    if n == 0:
        return 1
    
    count = 0
    # due to lower bound min_k, we evaluate only ordered solutions and prevent permutations
    for i in range(min_k, max_k+1):
        if n-i>=0:
            count += find_num_sums_aux(n-i, i, max_k)
    return count

def find_num_sums(n, k):
    count = find_num_sums_aux(n,1,k)
    return count