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
相关产品推荐
相关产品推荐

