Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何打印所有组合N可以写成1、3和4的和_Python_Dynamic Programming - Fatal编程技术网

Python 如何打印所有组合N可以写成1、3和4的和

Python 如何打印所有组合N可以写成1、3和4的和,python,dynamic-programming,Python,Dynamic Programming,我需要打印出一个数字N可以表示为1,3,4之和的不同方式 例如,n=5: 1+1+1+1+1+1 1+4 4+1 1+1+3 1+3+1 3+1+1 我正在使用一个动态编程解决方案来寻找n可以写成1,3,4之和的可能方法的数量 对于范围(4,n+1)内的i: DP[i]=DP[i-1]+DP[i-3]+DP[i-4] 返回DP[n] 这是可行的,我得到了N可以表达的可能方式的数量,在这种情况下是6,但我不确定如何打印出所有不同的方式: 1+1+1+1+1+1 1+4 4+1 1+1+3

我需要打印出一个数字N可以表示为1,3,4之和的不同方式

例如,n=5:

  • 1+1+1+1+1+1
  • 1+4
  • 4+1
  • 1+1+3
  • 1+3+1
  • 3+1+1
我正在使用一个动态编程解决方案来寻找n可以写成1,3,4之和的可能方法的数量


对于范围(4,n+1)内的i:
DP[i]=DP[i-1]+DP[i-3]+DP[i-4]
返回DP[n]
这是可行的,我得到了N可以表达的可能方式的数量,在这种情况下是6,但我不确定如何打印出所有不同的方式:

  • 1+1+1+1+1+1
  • 1+4
  • 4+1
  • 1+1+3
  • 1+3+1
  • 3+1+1

欢迎提出任何建议,谢谢

此递归生成器将生成实际的组合:

def combis(n):
    if n < 0:
        return
    if n == 0:
        yield []
    for x in (1, 3, 4):
        for combi in combis(n-x):
            yield [x] + combi

>>> list(combis(5))
[[1, 1, 1, 1, 1], [1, 1, 3], [1, 3, 1], [1, 4], [3, 1, 1], [4, 1]]
def组合(n):
如果n<0:
返回
如果n==0:
收益率[]
对于x英寸(1,3,4):
对于组合中的组合(n-x):
收益率[x]+combi
>>>名单(组合(5))
[[1, 1, 1, 1, 1], [1, 1, 3], [1, 3, 1], [1, 4], [3, 1, 1], [4, 1]]

当然,这不是DP,而是一个简单的未缓存且性能不佳的递归实现。但它应该为DP解决方案提供指导。

此递归生成器将生成实际的组合:

def combis(n):
    if n < 0:
        return
    if n == 0:
        yield []
    for x in (1, 3, 4):
        for combi in combis(n-x):
            yield [x] + combi

>>> list(combis(5))
[[1, 1, 1, 1, 1], [1, 1, 3], [1, 3, 1], [1, 4], [3, 1, 1], [4, 1]]
def组合(n):
如果n<0:
返回
如果n==0:
收益率[]
对于x英寸(1,3,4):
对于组合中的组合(n-x):
收益率[x]+combi
>>>名单(组合(5))
[[1, 1, 1, 1, 1], [1, 1, 3], [1, 3, 1], [1, 4], [3, 1, 1], [4, 1]]
当然,这不是DP,而是一个简单的未缓存且性能不佳的递归实现。但它应该为DP解决方案指明方向