Z3从数组中选择数字以获得和

Z3从数组中选择数字以获得和,z3,solver,z3py,Z3,Solver,Z3py,我在Z3Py中有一个数字数组: [1.000001, 1.000002, 1.000003, 1.000004, 1.000005, 1.000006, 1.000007, 1.000008, 1.000009, 1.00001, 1.000011, 1.000012, 1.000013, 1.000014, 1.000015, 1.000016, 1.000017, 1.000018, 1.000019, 1.00002, 1.000021, 1.000022, 1.000023, 1.000

我在Z3Py中有一个数字数组: [1.000001, 1.000002, 1.000003, 1.000004, 1.000005, 1.000006, 1.000007, 1.000008, 1.000009, 1.00001, 1.000011, 1.000012, 1.000013, 1.000014, 1.000015, 1.000016, 1.000017, 1.000018, 1.000019, 1.00002, 1.000021, 1.000022, 1.000023, 1.000024, 1.000025, 1.000026, 1.000027, 5.000001, 5.000002, 5.000003, 5.000004, 5.000005, 5.000006, 5.000007, 5.000008, 5.000009,5.00001]我想做的是从这个数组中选择15个数字,得到一个小于36的和

我如何使用Z3Py实现这一点

以下是我创建阵列的代码:

可能的学生=[] 对于范围1、28中的i: 可能的学生。附录1+i/1000000 对于范围1、11中的i: 可能的学生。附录5+i/1000000
有很多不同的方法可以解决这个问题。以下是最简单的编码:

从z3进口* s=解算器 nums=[1.000001,1.000002,1.000003,1.000004,1.000005,1.000006,1.000007,1.000008,1.000009 , 1.00001 , 1.000011, 1.000012, 1.000013, 1.000014, 1.000015, 1.000016, 1.000017, 1.000018 , 1.000019, 1.00002 , 1.000021, 1.000022, 1.000023, 1.000024, 1.000025, 1.000026, 1.000027 , 5.000001, 5.000002, 5.000003, 5.000004, 5.000005, 5.000006, 5.000007, 5.000008, 5.000009 , 5.00001 ] 拾取=[Bool'p'+范围内i的stri] sum=sum[Ifp,n,0表示压缩码中的p,n,nums] 拾取=总和[Ifp,1,0表示拾取中的p] s、 addpicked==15 s、 加法和<36 r=s.检查 如果r==sat: m=s.模型 k=1 对于rangelennums中的我: 如果m.evalpicks[i]: 打印%2d。拾取的:%2d:%s%k,i,strnums[i] k=k+1 打印和:+strm.evalsum.as_小数10 其他: 版画解算器 当我运行此程序时,我得到:

 1. Picked:  4: 1.000005
 2. Picked:  7: 1.000008
 3. Picked:  8: 1.000009
 4. Picked:  9: 1.00001
 5. Picked: 10: 1.000011
 6. Picked: 13: 1.000014
 7. Picked: 15: 1.000016
 8. Picked: 16: 1.000017
 9. Picked: 19: 1.00002
10. Picked: 23: 1.000024
11. Picked: 29: 5.000003
12. Picked: 30: 5.000004
13. Picked: 32: 5.000006
14. Picked: 33: 5.000007
15. Picked: 34: 5.000008
Sum: 35.000162

希望这能让你开始

解决这个问题可能有很多不同的方法。以下是最简单的编码:

从z3进口* s=解算器 nums=[1.000001,1.000002,1.000003,1.000004,1.000005,1.000006,1.000007,1.000008,1.000009 , 1.00001 , 1.000011, 1.000012, 1.000013, 1.000014, 1.000015, 1.000016, 1.000017, 1.000018 , 1.000019, 1.00002 , 1.000021, 1.000022, 1.000023, 1.000024, 1.000025, 1.000026, 1.000027 , 5.000001, 5.000002, 5.000003, 5.000004, 5.000005, 5.000006, 5.000007, 5.000008, 5.000009 , 5.00001 ] 拾取=[Bool'p'+范围内i的stri] sum=sum[Ifp,n,0表示压缩码中的p,n,nums] 拾取=总和[Ifp,1,0表示拾取中的p] s、 addpicked==15 s、 加法和<36 r=s.检查 如果r==sat: m=s.模型 k=1 对于rangelennums中的我: 如果m.evalpicks[i]: 打印%2d。拾取的:%2d:%s%k,i,strnums[i] k=k+1 打印和:+strm.evalsum.as_小数10 其他: 版画解算器 当我运行此程序时,我得到:

 1. Picked:  4: 1.000005
 2. Picked:  7: 1.000008
 3. Picked:  8: 1.000009
 4. Picked:  9: 1.00001
 5. Picked: 10: 1.000011
 6. Picked: 13: 1.000014
 7. Picked: 15: 1.000016
 8. Picked: 16: 1.000017
 9. Picked: 19: 1.00002
10. Picked: 23: 1.000024
11. Picked: 29: 5.000003
12. Picked: 30: 5.000004
13. Picked: 32: 5.000006
14. Picked: 33: 5.000007
15. Picked: 34: 5.000008
Sum: 35.000162

希望这能让你开始

欢迎来到堆栈溢出。你已经试过做什么了?请查看我们需要什么。您可以编辑您的问题,详细说明您遇到的确切问题、您试图解决的问题以及您的相关代码,以便我们提供帮助。@FluffyKitten-谢谢!欢迎来到堆栈溢出。你已经试过做什么了?请查看我们需要什么。您可以编辑您的问题,详细说明您遇到的确切问题、您试图解决的问题以及您的相关代码,以便我们提供帮助。@FluffyKitten-谢谢!