python中数组的排列生成问题

yihu33 2018-08-02 11:44:55
A=([35,35,35,41,35,35,29,41,31,35,35,35,35,35,31,35,35,35,31,41,31,35,35,31,35,41,31,41,35,31,29,23,35,35,35,31,29,35,35,31,35,31,35,29,31,31,35,35,31,35,35,41,35,35,35,31,35,31,35,31,31,31,29,23,35,35,35,35,31,35,31,35,35,31,29,35,35,29,35,31,31,35,31]),B=([83,83,68,78,83,83,83,83,68,83,78,68,83,83,83,83,83,78,83,83,83,83,83,83,83,83,83,83,61,83,83,83,61,83,83]),请问怎么计算出只包含0或1的35*83的数组C,使得C的第i行相加等于B[i],同时C的第j列相加等于A[j].这个问题与我工作关系很大,求大神帮帮忙。
...全文
347 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈年椰子 2018-08-13
  • 打赏
  • 举报
回复
的确, 递归方法太耗时了。
或者可以这样,
1、先按行,把所有的1都标上。 使每行都符合统计数,
2、按列计算合计数,新建两个列表,超计划列表,缺计划列表,
3、按行把超计划列表里的对应列的1调整到 缺计划列表里的对应列中。这个调整,是同行调整,不影响行合计数。
这样耗时应该小很多。
yihu33 2018-08-10
  • 打赏
  • 举报
回复
额,这是因为我负责的门店少,只有35家,但同事负责1000多家的……即使剔除了全1的,也很慢……
陈年椰子 2018-08-10
  • 打赏
  • 举报
回复
我看你的例子,全1的行和全1的列不少呀。 剔除全1行和全1列,剩下需要构造的列表应该不大吧?
yihu33 2018-08-10
  • 打赏
  • 举报
回复
6楼大锅,有没有迭代的方法啊,递归效率太低了,我一般要面对35*83,同事面对的是1000*40……
陈年椰子 2018-08-06
  • 打赏
  • 举报
回复
写了个简单递归示范。

# 5 * 3 的列表
a_len = 5
b_len = 3
# 目标
list_a = [2, 3, 3, 1, 2]
list_b = [4, 2, 5]
# 数据列表
list_data = []


def init_list():
# 初始化列表
for i in range(a_len):
list_data_item = []
for j in range(b_len):
list_data_item.append(0)
list_data.append(list_data_item)


def check_list():
# 合并计算列表值
global list_a, list_b
sum_a = []
sum_b = [0] * b_len
for i in range(a_len):
sum_a.append(sum(list_data[i]))
for j in range(b_len):
sum_b[j] = sum_b[j] + list_data[i][j]
if sum_a == list_a and sum_b == list_b:
return "ok"
else:
return "not"


def ffr(i, j):
# 遍历填写列表
global ffr_times, list_data, a_len, b_len
if i >= a_len :
if check_list() == "ok":
print "Create Ok", list_data
return "ok"
else:
return ""
if j >= b_len:
ffr(i+1, 0)
else:
list_data[i][j] = 0
ffr(i, j + 1)
list_data[i][j] = 1
ffr(i, j + 1)

init_list()
ffr(0,0)

yihu33 2018-08-05
  • 打赏
  • 举报
回复
具体怎么实现呢???
yihu33 2018-08-04
  • 打赏
  • 举报
回复
大于等于35的都按35算,因为只有35家店
陈年椰子 2018-08-04
  • 打赏
  • 举报
回复
想到个思路, 不知道是否合适
剔除 所有的35 和 83 , 这样变成求 M*N 的列表 , 这个列表远比 35*83小。 遍历M*N所有0,1的情况, 判断是否符合。 如符合则返回。
Changer Chen 2018-08-03
  • 打赏
  • 举报
回复
A里面有大于35的,C是35*83,可能吗?
yihu33 2018-08-03
  • 打赏
  • 举报
回复
C每行之和可以比B对应多1,每列之和可以比A对应多1

37,718

社区成员

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

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