文章目录(Table of Contents)
mathematica函数子集和元组的使用
我们从一个问题来了解这两个函数。
问题
现有两个1Kg的快件,一个2Kg的快件,三个3Kg的快件,三个4Kg的快件和一个5Kg的快件,用两个承受15Kg的布袋装完所有快件有多少种可能?
用到的函数
- `DeleteDuplicates`:删除重复的元素
- `Subsets`:获得子集
- `Tuples`:获得所有的组合
关于Subsets,Tuples这两个函数我们可以看一下下面这张图片,来看一下两者的区别
![Mathematica进阶[2]–mathematica函数子集和元组的使用](http://ootgubexr.bkt.clouddn.com/snipaste_20170731_112809.png?imageView2/0/q/75|watermark/2/text/5b6u5L-h5YWs5LyX5Y-3OuaWh-iJuuaVsOWtpuWQmw==/font/5a6L5L2T/fontsize/500/fill/IzIyMjEyMQ==/dissolve/100/gravity/SouthEast/dx/10/dy/10)
解答
首先我们先计算出每个袋子中应该如何装快件,使得正好放满15Kg。
weight = {1, 1, 2, 3, 3, 3, 4, 4, 4, 5};
way = Select[DeleteDuplicates[Subsets[weight]], Total[#] == 15 &]
![Mathematica进阶[2]–mathematica函数子集和元组的使用](http://ootgubexr.bkt.clouddn.com/snipaste_20170731_111947.png?imageView2/0/q/75|watermark/2/text/5b6u5L-h5YWs5LyX5Y-3OuaWh-iJuuaVsOWtpuWQmw==/font/5a6L5L2T/fontsize/500/fill/IzIyMjEyMQ==/dissolve/100/gravity/SouthEast/dx/10/dy/10)
接着计算两个袋子的装法,使得两个袋子正好装掉上面所有的快件
res = Select[{#1, #2, Join[#1, #2]} & @@@ Tuples[way, 2],
Sort[#[[3]]] == weight &];
DeleteDuplicates[Sort[{#1, #2}] & @@@ res[[All, {1, 2}]]] // Column
![Mathematica进阶[2]–mathematica函数子集和元组的使用](http://ootgubexr.bkt.clouddn.com/snipaste_20170731_112001.png?imageView2/0/q/75|watermark/2/text/5b6u5L-h5YWs5LyX5Y-3OuaWh-iJuuaVsOWtpuWQmw==/font/5a6L5L2T/fontsize/500/fill/IzIyMjEyMQ==/dissolve/100/gravity/SouthEast/dx/10/dy/10)
完整解答
![Mathematica进阶[2]–mathematica函数子集和元组的使用](http://ootgubexr.bkt.clouddn.com/snipaste_20170731_112011.png?imageView2/0/q/75|watermark/2/text/5b6u5L-h5YWs5LyX5Y-3OuaWh-iJuuaVsOWtpuWQmw==/font/5a6L5L2T/fontsize/500/fill/IzIyMjEyMQ==/dissolve/100/gravity/SouthEast/dx/10/dy/10)
- 微信公众号
- 关注微信公众号
-
- QQ群
- 我们的QQ群号
-












2017年10月6日 下午8:27 1F
数学这么厉害 佩服 学霸
2017年10月6日 下午9:57 B1
@ zxm 谢谢支持,会继续更新的,希望可以持续关注我们。