免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6749 | 回复: 26
打印 上一主题 下一主题

求一个多元一次函数的可能解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-17 00:22 |只看该作者 |倒序浏览
cu的大神们,小弟学艺不精,请教个问题

对于给定的元祖(或者列表)a,求元祖(或者列表)中各个元素乘一个整数然后在求和等于一个常数b

例子:a=(1,2,3),b=100,求1*x + 2 * y + 3 * z = 100中x,y,z的可能解对应的表达式。
解有:
1*100 +2 *0 +3*0=100
1*98 + 2 *1 +3 *0 =100


那元祖(或者列表)如果为定长,那么尚可把每个可能遍历求解,那么如果元祖(或者列表)是未知长度呢?

求给个思路或者给段核心代码,谢谢

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [报告]
发表于 2014-06-17 09:42 |只看该作者
for x in xrange(100):
    for y in xrange(50):
        for z in xrange(33):
            if x + 2*y + 3 * z == 100:
                print("x=%d,y=%d,z=%d" % (x,y,z))

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
3 [报告]
发表于 2014-06-17 09:46 |只看该作者
  1. #一条直线方程,解的个数是无限的,我暂且假定,楼主想要的是只有非负整数解。
  2. a = (1, 2, 3)
  3. b = 100

  4. for x in range(0, b // a[0]):
  5.     for y in range(0, b // a[1]):
  6.         for z in range(0, b // a[2]):
  7.             if a[0] * x + a[1] * y + a[2] * z == b:
  8.                 print('{i} * {x} + {j} * {y} + {k} * {z} = {b}'.format(
  9.                     i = a[0], j = a[1], k = a[2], x = x, y = y, z = z, b = b))
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-06-17 11:16 |只看该作者
回复 3# ssfjhh

就是你理解的意思

那如果 a这个元祖 长度不定呢?
总不能这样子遍历啊 我提问上说道了

麻烦解答下呢

   

论坛徽章:
0
5 [报告]
发表于 2014-06-17 12:17 |只看该作者
回复 2# bikong0411

这个是简单,如果a的元素长度不定呢
   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
6 [报告]
发表于 2014-06-17 13:58 |只看该作者
回复 5# NO_Getway


    显而易见,递规解决,代码只能晚上给你。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
7 [报告]
发表于 2014-06-17 14:31 |只看该作者
回复 1# NO_Getway
你可以尝试使用SymPy的Solver,这个可以的。

论坛徽章:
0
8 [报告]
发表于 2014-06-17 14:48 |只看该作者
回复 6# ssfjhh

写了个递归的代码,按照你的思路,还能改进吗?
  1. def printResult(A,a,b):
  2.     result = []
  3.     for ll,ai in zip(A,a):
  4.         result.append( ' {} * {} '.format(ll,ai))
  5.     print "+".join(result)+" = {} ".format(b)

  6. def solveEq(a,b,P,A,i):
  7.     if i == len(P):
  8.         s = sum([ai*Ai for Ai,ai in zip(A,a)])
  9.         if s == b :
  10.             printResult(A,a,b)
  11.         return

  12.     for j in range(P[i]):
  13.         A[i] = j
  14.         solveEq(a,b,P,A,i+1)


  15. a = (1,2,3)
  16. b = 10
  17. P = [b/ai+1 for ai in a ]
  18. A = [0] * len(a)

  19. solveEq(a,b,P,A,0)
复制代码
结果:
  1. 0 * 1 + 2 * 2 + 2 * 3  = 10
  2. 0 * 1 + 5 * 2 + 0 * 3  = 10
  3. 1 * 1 + 0 * 2 + 3 * 3  = 10
  4. 1 * 1 + 3 * 2 + 1 * 3  = 10
  5. 2 * 1 + 1 * 2 + 2 * 3  = 10
  6. 2 * 1 + 4 * 2 + 0 * 3  = 10
  7. 3 * 1 + 2 * 2 + 1 * 3  = 10
  8. 4 * 1 + 0 * 2 + 2 * 3  = 10
  9. 4 * 1 + 3 * 2 + 0 * 3  = 10
  10. 5 * 1 + 1 * 2 + 1 * 3  = 10
  11. 6 * 1 + 2 * 2 + 0 * 3  = 10
  12. 7 * 1 + 0 * 2 + 1 * 3  = 10
  13. 8 * 1 + 1 * 2 + 0 * 3  = 10
  14. 10 * 1 + 0 * 2 + 0 * 3  = 10
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-06-17 15:19 |只看该作者
回复 6# ssfjhh

先谢谢了
   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
10 [报告]
发表于 2014-06-17 21:14 |只看该作者
回复 8# Hadron74


    Nice。

@NO_Getway
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP