整数组合数与特定列表中的数字
Number of Integer Composition with the number which is in a specific list
每个正整数 n 有 2^(n−1) 种不同的成分。如果我想要的组合数量只有我列表中的特定数量怎么办:
例如4的组合是
4
3 1
1 3
2 2
2 1 1
1 2 1
1 1 2
1 1 1 1
但是如果我想要4的组合数,它只有1和2,
我如何计算不同成分的数量?
2 2
2 1 1
1 2 1
1 1 2
1 1 1 1
已编辑:
这里 Haskell 计算数字的代码,但我认为即使我为数字 70 添加记忆也需要很长时间
main :: IO ()
main = do
putStrLn "Enter the integer number"
num' <- getLine
let num = read num' :: Int
putStr ""
let result= composition num
let len=length result
print len
--print result
composition 0 = [[]]
composition n = [x:rest | x <- [1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800,900,1000],x<=n ,rest <- composition (n-x)]
您可以使用动态规划来计算所需作文的数量。
您的示例的递归关系示例:
P(4, [1,2]) = P(3, [1,2]) + P(2, [1,2])
这里 P(N, [list])
是从列表中生成 N 的变体数量
尝试概括公式并使用自上而下的记忆或自下而上的table填充DP来快速找到结果。
Delphi 示例:
var
A: TArray<Integer>;
Mem: TArray<Int64>;
N, i: Integer;
function Calc(N: Integer): Int64;
var
i: Integer;
begin
if Mem[N] >= 0 then
Exit(Mem[N]);
i := 0;
Result := 0;
while A[i] <= N do begin
Result := Result + Calc(N - A[i]);
Inc(i);
end;
Mem[N] := Result;
end;
begin
//should be sorted
//-1 - sentinel value to stop
A := TArray<Integer>.Create(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60,
70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, -1);
for N := 10 to 64 do begin
SetLength(Mem, N + 1);
for i := 1 to N do
Mem[i] := -1; //not initialized yet
Mem[0] := 1;
Memo1.Lines.Add(Format('%d %d', [N, Calc(N)]));
end;
每个正整数 n 有 2^(n−1) 种不同的成分。如果我想要的组合数量只有我列表中的特定数量怎么办:
例如4的组合是
4
3 1
1 3
2 2
2 1 1
1 2 1
1 1 2
1 1 1 1
但是如果我想要4的组合数,它只有1和2, 我如何计算不同成分的数量?
2 2
2 1 1
1 2 1
1 1 2
1 1 1 1
已编辑: 这里 Haskell 计算数字的代码,但我认为即使我为数字 70 添加记忆也需要很长时间
main :: IO ()
main = do
putStrLn "Enter the integer number"
num' <- getLine
let num = read num' :: Int
putStr ""
let result= composition num
let len=length result
print len
--print result
composition 0 = [[]]
composition n = [x:rest | x <- [1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800,900,1000],x<=n ,rest <- composition (n-x)]
您可以使用动态规划来计算所需作文的数量。 您的示例的递归关系示例:
P(4, [1,2]) = P(3, [1,2]) + P(2, [1,2])
这里 P(N, [list])
是从列表中生成 N 的变体数量
尝试概括公式并使用自上而下的记忆或自下而上的table填充DP来快速找到结果。
Delphi 示例:
var
A: TArray<Integer>;
Mem: TArray<Int64>;
N, i: Integer;
function Calc(N: Integer): Int64;
var
i: Integer;
begin
if Mem[N] >= 0 then
Exit(Mem[N]);
i := 0;
Result := 0;
while A[i] <= N do begin
Result := Result + Calc(N - A[i]);
Inc(i);
end;
Mem[N] := Result;
end;
begin
//should be sorted
//-1 - sentinel value to stop
A := TArray<Integer>.Create(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60,
70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, -1);
for N := 10 to 64 do begin
SetLength(Mem, N + 1);
for i := 1 to N do
Mem[i] := -1; //not initialized yet
Mem[0] := 1;
Memo1.Lines.Add(Format('%d %d', [N, Calc(N)]));
end;