给定正整数n,找到将n分成四部分或将n表示为四个正整数之和的方法的数量。这里n从0到5000不等。
def foo(target, k, j):
count = 0
map = {}
if target in map.keys() and map[target] == k:
return map[target]
if target == 0 and k == 0:
return 1
if target <= 0 or k < 0:
return 0
for i in range(j, target+1):
count += foo(target-i, k-1, i)
map[target] = count
return count
print(foo(10, 4, 1))
我用上面的递归解决方案解决了这个问题,但我刚看到有人使用以下动态编程解决方案。
f(0,0)= 1
f(target,k)= 0如果k>目标或(目标> 0和k = 0)
f(目标,k)= f(目标-k,k)+ f(目标-1,k-1)
有人可以启发我这个解决方案吗?
答案 0 :(得分:1)
这个解决方案是正确的,但有点棘手,我会尽力向你说清楚。
如果target=25
我们将其拆分为25=9+7+5+4
。我们用4列(1 * 9,1 * 7,1 * 5,1 * 4)表示:
但另一方面,您可以将图像视为9行(1 * 4,1 * 4,1 * 4,1 * 4,1 * 3,1 * 2,1 * 2,1 * 1,1 * 1)。
因此,您会发现您的解决方案是按列方式构建图像,该解决方案是按行方式。
所以我们来看看这个解决方案的细节:
target
个图块,行的长度为k
k
这就是全部。
如果您还有任何疑问,可以在这里留言。
答案 1 :(得分:0)
给定数字n,找到可以表示为x1+x2+x3+x4
之和的方式的数量xi>=0
答案是(n+3)C(3)
通常,x1+x2+x3+...+xn=k with xi>=0
有解决方案(k+n-1)C(n-1)
这里,k = n且n = 4。