📄 mmm.m
字号:
%函数功能:将数n分为k组,返回 分组个数length 和 分组明细数组a
%内嵌初始化数组函数:initial
function [length,a]=mmm(n,k)
if k==1
length = 1;a = n;
elseif k==2
N = floor(n/2);
b = zeros(N,k);
b(1,:) = [1,n-1];
for j=2:N
b(j,:) = [b(j-1,1)+1,b(j-1,2)-1];
end
length = N; a = b;
elseif k>=3
%程序初始化
N= 900000 ;%缓冲数组的行数,待确一合的数据、
b = zeros(N,k);
flag1 = k-3; %指示未开垦的土地列
flag2 = k-2; %指示当前活跃的土地列
flag3 = k-1; %指示最后两列工作区
flag_num = 1;
j=1;
for i=1:k-1
b(j,i)=1;
end
b(j,k)=n-k+1;
flag_num = flag_num + 1;
j=j+1;
while ~( (flag1==flag2)&&(flag1==0) )
while 1
while ( b(j-1,flag3)+1 )<=( b(j-1,flag3 + 1)-1 )%最后两列工作区
for i=1:flag3 -1
b(j,i) = b(j-1,i);
end
b(j,flag3) = b(j-1,flag3) + 1 ;
b(j,flag3 +1) = b(j-1,flag3 +1) - 1 ;
j=j+1;
end
%判断是否跳出最后三列的工作范围
if (b(j-1,flag2)+1)<=(b(j-1,flag2 + 1)-1) %第一种情况:可以继续 如:1 6 7
b(j,:)=initial(b,j,flag2,flag_num,n,k);
flag_num = flag_num + 1;
j=j+1;
elseif n>=( sum(b(j-1,1:flag2 -1))+(k - flag2 + 1)*flag_num ) %第二种情况:例外 如:4 5 6
b(j,:)= initial(b,j,flag2,flag_num,n,k);
flag_num = flag_num + 1;
j=j+1;
else
break; %不满足两种继续执行的条件则跳出,调整flag1和flag2
end
end
while 1
if flag2==flag1 %需新开垦土地,调整flag1
if flag2==0 % 跳出最外的while循环,整个程序结束
break;
end
flag1 = flag1 - 1;
flag_num = b(j-1,flag2)+1;
b(j,:)=initial(b,j,flag2,flag_num,n,k);
if b(j,k)<b(j,k-1)%如果数据出错则清零刚生的数据并将程序终止,例如:最后一个元素小于倒数第二个元素
for ii=1:k
b(j,ii)=0;
end
flag1=0;flag2=0;break;
end
j=j+1;
flag2 = k-2;
flag_num = b(j-1,flag2)+1;
break;
elseif ((b(j-1,flag2)+1)<=(b(j-1,flag2 + 1)-1))||(n>=(sum(b(j-1,1:flag2 -1)) + (k - flag2 + 1)*(b(j-1,flag2)+1)))%调整flag2以进入最后三列的工作组重新开始工作
flag_num = b(j-1,flag2)+1;
b(j,:)=initial(b,j,flag2,flag_num,n,k); j=j+1;
flag2 = k-2; flag_num = b(j-1,flag2)+1; break;
else
flag2 = flag2 - 1;%
end
end
end
i=1;
%将非零行元素输出
while b(i,1)
a(i,:)=b(i,:);
i=i+1;
end
length=i-1;a;
end
%函数功能:初始化数组指定行,如:1 1 1 9
function dd=initial(d,jj,kk,num,n,k)
c=d;
for i=1:kk-1 %照抄前面kk-1个数据
c(jj,i)=c(jj-1,i);
end
for i=kk:k-1 %将给定的num赋给下面的位
c(jj,i)=num;
end
c(jj,k)=n-sum(c(jj,1:k-1));%为最后一个赋值
dd=c(jj,:);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -