找回密码
 注册
Simdroid-非首页
查看: 130|回复: 5

【求助】m个相同的小球放入n个不同的盒子后续

[复制链接]
发表于 2013-5-30 15:07:30 | 显示全部楼层 |阅读模式 来自 大连理工大学
悬赏10仿真币已解决
本帖最后由 xiangpan18 于 2013-5-30 15:12 编辑

前几天问了一个问题,得到诸位帮助,多谢,现在提出这个问题,增加条件。m个相同小球,n个不同盒子,m>=n,小球全部放进盒子,至少有一个盒子为空,求组合。我按照一个盒子空,两个盒子空,...,直至n-1个盒子空的情况分别计算,然后加和,给出组合数应该为,想得到各个组合,请各位不吝赐教,不胜感激!

最佳答案

查看完整内容

将之前代码稍作修改
发表于 2013-5-30 15:07:31 | 显示全部楼层 来自 河北
Simdroid开发平台
本帖最后由 qibbxxt 于 2013-5-31 07:56 编辑

将之前代码稍作修改
  1. m = 5;
  2. n = 3;
  3. f = fullfact(m+ones(n, 1))'-1;
  4. f( :,sum(f) ~= m) = [];
  5. index = arrayfun(@(x)nnz(f(:,x)),1:length(f));
  6. % 分别显示
  7. arrayfun(@(x)disp(f(:,index == x)),n -1 : -1 : 1)
  8. % 一起
  9. disp(f(:,index ~= n))
复制代码
  1.      4     3     2     1     4     0     3     0     2     0     1     0
  2.      1     2     3     4     0     4     0     3     0     2     0     1
  3.      0     0     0     0     1     1     2     2     3     3     4     4

  4.      5     0     0
  5.      0     5     0
  6.      0     0     5

  7.      5     4     3     2     1     0     4     0     3     0     2     0     1     0     0
  8.      0     1     2     3     4     5     0     4     0     3     0     2     0     1     0
  9.      0     0     0     0     0     0     1     1     2     2     3     3     4     4     5
复制代码

点评

我要把这个选为最佳回复,怎么操作啊  发表于 2013-6-8 08:45
qibbxxt 对 arrayfun 函数的应用简直到了炉火纯青的地步,呵呵。  发表于 2013-6-5 03:33

评分

2

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-6-3 14:44:13 | 显示全部楼层 来自 大连理工大学
qibbxxt 发表于 2013-5-31 07:52
将之前代码稍作修改

读写版主帮助,不知如何将版主回复选为最佳答案
f(index>=n)=[]
回复

使用道具 举报

发表于 2013-6-5 04:11:06 | 显示全部楼层 来自 英国
1#公式改过了吧,这次是对的。
不过还有更简洁的形式:(Tex公式显示有问题,就用Matlab的形式来表示。)
  1. nchoosek(m+n-1,n-1) - nchoosek(m-n+n-1,n-1) % m>=n
  2. % 符合条件的组合数 = 无条件的所有组合数 -  不符合条件的组合数
复制代码
可以比较,验证一下,呵呵。

评分

1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-6-6 08:52:33 | 显示全部楼层 来自 大连理工大学
本帖最后由 xiangpan18 于 2013-6-6 09:08 编辑
lin2009 发表于 2013-6-5 04:11
1#公式改过了吧,这次是对的。
不过还有更简洁的形式:(Tex公式显示有问题,就用Matlab的形式来表示。)可以 ...

兄台所言极是,全部的组合数减去每盒至少一个的组合。这个问题本来是这样的,我要把全部组合分组,至少一盒空,所有盒大于一且至少一盒只有一个,所有盒大于二且至少一个盒子只有二,......这样将全部组合分组。如果以三个变量为轴建立一个空间,这样可以看做是一个截面和这个立方体各层的交点
按照之前版主的指导,我这样完成的
  1. clear
  2. clc
  3. m=8;
  4. n=3;
  5. j_max=2;
  6. ind=indexcomb(m,n);      %这个是之前您的程序段写成一个函数,即用插板法实现功能m个相同小球任意放入n个不同盒子的组合
  7. index = arrayfun(@(x)nnz(ind(x,:)),1:size(ind,1));
  8. j1=ind(index<n,:);
  9. ind(index<n,:)=[];
  10. index = arrayfun(@(x)nnz(ind(x,:)-1),1:size(ind,1));
  11. j2=ind(index<n,:);
  12. ind(index<n,:)=[];
  13. index = arrayfun(@(x)nnz(ind(x,:)-2),1:size(ind,1));
  14. j3=ind(index<n,:);
复制代码

评分

1

查看全部评分

回复

使用道具 举报

发表于 2013-7-6 09:32:12 | 显示全部楼层 来自 澳大利亚
正在做这方面的工作,很有意义,分享,学习
回复

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 18:16 , Processed in 0.040787 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表