【Python】请问怎样打印出零钱组合的所有情况?

Yeesly 2018-10-16 10:28:24
假如有[1,2]2种面值的零钱若干,要得到4元,需要各种面值的硬币个数?
请问怎样才能返回所有的情况?不是求有多少种情况,是打印出所有的组合,如下:
[4,0]
[0,2]
[2,2]
...全文
423 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
瞎编靠运气 2018-11-06
  • 打赏
  • 举报
回复
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from itertools import combinations_with_replacement as CBR
n=5
cb=CBR(range(n),2)
print(*(filter (lambda t:t[0]+t[1]==4,cb)),sep='\n')
DreamAndThink。 2018-10-25
  • 打赏
  • 举报
回复
引用 6 楼 Yeesly的回复:
[quote=引用 4 楼 hbu_pig 的回复:]
我给你写个穷举法的代码吧
total=4
money=[1,2]
results=[]
for i in range(total/money[0]+1):
result=[i]
for ii in range(total/money[1]+1):
if i*money[0]+ii*money[1]==total:
result.append(ii)
results.append(result)
print(results)


请问下如果是(1,2,5)10的所有组合,要怎么把循环写进去?[/quote] 一样的,多嵌套一个for循环就好了
Yeesly 2018-10-19
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28332285 的回复:
[quote=引用 4 楼 hbu_pig 的回复:]
我给你写个穷举法的代码吧
total=4
money=[1,2]
results=[]
for i in range(total/money[0]+1):
result=[i]
for ii in range(total/money[1]+1):
if i*money[0]+ii*money[1]==total:
result.append(ii)
results.append(result)
print(results)


请问下如果是(1,2,5)10的所有组合,要怎么把循环写进去?[/quote]

total=57
money=[200,100,50,20,10,5,2,1]
results=[]
for i in range(int(total/money[0])+1):
result=[i]
for ii in range(int(total/money[1])+1):
result = [ii]
for iii in range(int(total / money[2]) + 1):
result = [iii]
for iiii in range(int(total / money[3]) + 1):
result = [iiii]
for iiiii in range(int(total / money[4]) + 1):
result = [iiiii]
for iiiiii in range(int(total / money[5]) + 1):
result = [iiiiii]
for iiiiiii in range(int(total / money[6]) + 1):
result = [iiiiiii]
for iiiiiiii in range(int(total / money[7]) + 1):
if i*money[0]+ii*money[1]+iii*money[2]+iiii*money[3]+iiiii*money[4]+iiiiii*money[5]+iiiiiii*money[6]+iiiiiiii*money[7]==total:
result.append(i)
result.append(ii)
result.append(iii)
result.append(iiii)
result.append(iiiii)
result.append(iiiiii)
result.append(iiiiiii)
result.append(iiiiiiii)
results.append(result[1:9])
print(results)

好像写的太复杂了
Yeesly 2018-10-18
  • 打赏
  • 举报
回复

引用 4 楼 hbu_pig 的回复:
我给你写个穷举法的代码吧
total=4
money=[1,2]
results=[]
for i in range(total/money[0]+1):
result=[i]
for ii in range(total/money[1]+1):
if i*money[0]+ii*money[1]==total:
result.append(ii)
results.append(result)
print(results)


请问下如果是(1,2,5)10的所有组合,要怎么把循环写进去?
欢乐的小猪 2018-10-18
  • 打赏
  • 举报
回复
results:
[[0, 2], [2, 1], [4, 0]]
欢乐的小猪 2018-10-18
  • 打赏
  • 举报
回复
我给你写个穷举法的代码吧
total=4
money=[1,2]
results=[]
for i in range(total/money[0]+1):
result=[i]
for ii in range(total/money[1]+1):
if i*money[0]+ii*money[1]==total:
result.append(ii)
results.append(result)
print(results)
尘封记忆 2018-10-17
  • 打赏
  • 举报
回复
itertools这个模块可以了解一下
combinations_with_replacement()的接口
尘封记忆 2018-10-17
  • 打赏
  • 举报
回复
你的[4,0]和[0,2]的列表是认真的吗,不是要得到4吗,
还是[1,1,1,1],[1,1,2]这样子的?
oyljerry 2018-10-17
  • 打赏
  • 举报
回复
这个就是一个直接递归,得到所有符合条件的组合。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧