计算一个N个选项中和为X的所有组合数



下面就是一个最近微信上流传的一个测试:

假如5块钱可以买一个女朋友,你会买什么样的?下面是每项的价格

有钱-4元, 长得好看-3元, 会做饭-3元, 忠诚-3元, 处女-2元, 温柔-2元, 活泼可爱-2元, 大长腿-1元, 聪明-1元, 胸大-1元


--计算从1到maxNumber的自然数中取selNum个数的所有组合
function CalcNaturalNumberComb(maxNumber, selNum, tabReturn)
    local tabComb = {}
    comb_natural_number_recursive_func = function(m,k,tab)
        for i=m,k,-1 do
            tabComb[k+1] = i
           
            if k > 1 then
                comb_natural_number_recursive_func(i-1,k-1,tab)
            else
                local tabOut = {}
                local nStart = tonumber(tabComb[1])
                for n=nStart,1,-1 do
                    table.insert(tabOut,tabComb[n+1])
                end
                table.insert(tab,tabOut)
            end
        end
    end

    tabComb = {}
    tabComb[1] = selNum
    comb_natural_number_recursive_func(maxNumber, selNum, tabReturn)
end

TAB_X =
{
    ["有钱"] = 4,
    ["长得好看"] = 3, ["会做饭"] = 3, ["忠诚"] = 3, 
    ["处女"] = 2, ["温柔"] = 2, ["活泼可爱"] = 2,
    ["大长腿"] = 1, ["聪明"] = 1, ["胸大"] = 1,
}

TAB_NAME = {}
TAB_VAL = {}
for k,v in pairs(TAB_X) do table.insert(TAB_NAME,k) table.insert(TAB_VAL,v) end

local tabCombAll = {}
for i=1,table.count(TAB_X) do
    local tabComb = {}
    CalcNaturalNumberComb(table.count(TAB_X), i, tabComb)
    table.insert(tabCombAll, tabComb)
end

local id = 1
for i=1,#tabCombAll do
    for k=1,#tabCombAll[i] do
        local c = 0
        local s = ""
        for m=1,#tabCombAll[i][k] do
            c = c + TAB_VAL[tabCombAll[i][k][m]]
            s = s .. TAB_NAME[tabCombAll[i][k][m]].."["..TAB_VAL[tabCombAll[i][k][m]].."]"
        end
        if c == 5 then
            print(string.format("%02d.%s", id, s))
            id = id + 1
        end
    end
end

猜你喜欢

转载自blog.csdn.net/missmecn/article/details/52070661