给定多个金额,以及笔记列表(您不能重复它们)。我需要找到笔记组合来放弃所有金额。
例如:如果注释是:
[1,1,5,6,6,8,8,10]
并且金额是[15, 14, 16]
。解决方案可以是
{15:(10,5), 14:(6,8), 16:(1,1,6,8)}
这是此处描述的变更问题的变体。下面是使用动态编程解决标准变更问题的代码,给定 V(无限面额的集合)和 C(金额)。如何为非重复音符和多个金额修改它。还需要每个数量的最终组合。
def min_change(V, C):
m, n = len(V)+1, C+1
table = [[0] * n for x in xrange(m)]
for j in xrange(1, n):
table[0][j] = float('inf')
for i in xrange(1, m):
for j in xrange(1, n):
aC = table[i][j - V[i-1]] if j - V[i-1] >= 0 else float('inf')
table[i][j] = min(table[i-1][j], 1 + aC)
return table[m-1][n-1]
更新:
改变问题是NP完全的。这里有详细的论文http://www.or.deis.unibo.it/kp/Chapter5.pdf尽管如此,还是有一些解决方案是相当理想的并且可以给出结果。