⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmm.m

📁 将输入的数据n分为指定的k组
💻 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 + -