You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB生成线性方程x1+…+xk=d的无重复非负整数解

生成线性方程非负整数解的无重复MATLAB实现

要生成满足x1 + x2 + ... + xk = d的所有非负整数解(无重复),随机生成的方式必然会出现重复且无法保证覆盖全部解。正确的做法是利用隔板法的组合数学原理,直接枚举所有可能的解,步骤如下:

核心思路

非负整数解的数量等价于在d个相同元素之间插入k-1个隔板的组合数C(d+k-1, k-1)。每个隔板的位置对应一组解:

  • 假设我们有d+k-1个位置,选k-1个位置放隔板,剩下的d个位置放元素
  • 相邻隔板(或两端)之间的元素数量就是对应变量的取值

MATLAB代码实现

d = 5; % 目标和
k = 2; % 变量个数

% 计算组合数,确定解的数量
num_solutions = nchoosek(d + k - 1, k - 1);
listt = zeros(num_solutions, k);

% 生成所有隔板位置的组合
comb = nchoosek(1:d+k-1, k-1);

for i = 1:num_solutions
    % 在隔板前后补0和d+k,方便计算间隔
    pos = [0, comb(i,:), d + k];
    % 每个变量的取值为相邻位置差减1
    listt(i,:) = diff(pos) - 1;
end

disp(listt);

代码验证(d=5, k=2)

运行后输出的listt会是6行无重复的有效解:

0     5
     1     4
     2     3
     3     2
     4     1
     5     0

完全符合C(5+2-1,2-1)=6的要求,且无重复。

扩展说明

  • 该方法适用于任意正整数d和k,效率远高于随机生成后去重的方式
  • 若d和k较大,组合数会快速增长,需注意内存占用问题

内容的提问来源于stack exchange,提问作者Christina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:46:13