获得总数与x数量不同的较小数字MATLAB的不同组合

时间:2014-12-06 00:22:32

标签: matlab recursion vector

我基本上试图创建一个代表不同方式的列表"更改" (如钱)可以给出我的例子就是这个

 printCells(exchange([1,3,10],20))

并输出

ans =
<0,0,2>
<1,3,1>
<2,6,0>
<4,2,1>
<5,5,0>
<7,1,1>
<8,4,0>
<10,0,1>
<11,3,0>
<14,2,0>
<17,1,0>
<20,0,0>

输出中的单元格表示在该组合中使用每个标记的次数。我试图用这个递归,我真的不知道从哪里开始

提前致谢,

1 个答案:

答案 0 :(得分:0)

好吧,我编写了一些递归,我得到了以下内容:

function [] = change()
    % specify inputs here
    options = [1,3,10];
    target  = 20;

    global solutions;   solutions = [zeros(1, size(options,2))];
    sum_up(options, target);
end

function [] = sum_up(options, target)
    clc;    
    recursive_sum(options, target, []);
end

function [] = recursive_sum(options, target, partial)
    global solutions;
    s = 0;
    for i=1:size(partial,2)
        s = s + partial(i);
    end
    if s == target
        entry = [];
        for i=1:size(options, 2)
            entry = [entry sum(partial == options(i))];
        end
        if ~sum(ismember(solutions(:,:), entry, 'rows'))
            fprintf('%d, ', entry);
            solutions = [solutions; entry];
            fprintf('= %d\n', sum(partial));
        end
    end
    if s >= target
        return;
    end
    for i=1:size(options,2)
        recursive_sum(options, target, [partial options(i)]);
    end
end

输出:

20, 0, 0, = 20
17, 1, 0, = 20
14, 2, 0, = 20
11, 3, 0, = 20
10, 0, 1, = 20
8, 4, 0, = 20
7, 1, 1, = 20
5, 5, 0, = 20
4, 2, 1, = 20
2, 6, 0, = 20
1, 3, 1, = 20
0, 0, 2, = 20

注意:您的matlab .m文件应该被称为change.m

我希望我能帮助你:)

Code Golf

只是为了好玩,这是一个非常小的版本:

function[]=change()
    o=[1,3,10]; t=20;
    global l; l=[zeros(1,size(o,2))];
    rs(o,t,[]); disp(l(2:end, :));
end

function[]=rs(o,t,p)
    global l; s=0;
    for i=1:size(p,2); s=s+p(i); end
    if s==t; e=[];
        for i=1:size(o, 2); e=[e sum(p==o(i))]; end
        if ~sum(ismember(l(:,:),e,'rows')); l=[l; e]; end
    end
    if s>=t; return; end
    for i=1:size(o,2); rs(o,t,[p o(i)]); end
end