算法2013110702

来源:互联网 发布:哪个药店软件正品 编辑:程序博客网 时间:2024/06/15 04:19

题设:以1、2、5、10元为基本单位,求将任意X元分解的所有组合。

解法:利用递归与动态规划。

# make changes for value with units [0, pos]def makeChanges(value, units, pos, cache):assert value >= 0assert len(units) >= 1assert pos >= 0aKey = (value, pos)if (cache.has_key(aKey)):return cache[aKey]if pos == 0:if value%units[0] == 0:result = [[value/units[0]]]else:result = []else:result = []subValue = valuei = 0while True:subResult = makeChanges(subValue, units, pos-1, cache)for subItem in subResult:subItem.append(i)result.append(subItem)subValue -= units[pos]i += 1if subValue < 0:breakcache[aKey] = resultreturn result# get changes for value with unitsdef getChanges(value, units):assert value >= 0assert len(units) >= 1return makeChanges(value, units, len(units)-1, {})units = [1, 2, 5, 10]value = 20print getChanges(value, units)

附:在线代码测试http://ideone.com/v0nIAZ

原创粉丝点击