1. 程式人生 > >質數和分解(動態規劃)

質數和分解(動態規劃)

Description

  任何大於 1 的自然數 n,都可以寫成若干個大於等於 2 ,且小於等於 n 的質數之和表示式(包括只有一個數構成的和表示式的情況),並且可能有不止一種質數和的形式。例如9 的質數和表示式就有四種本質不同的形式:
9 = 2+5+2 = 2+3+2+2 = 3+3+3 = 2+7 。
  這裡所謂兩個本質相同的表示式是指可以通過交換其中一個表示式中參加和運算的各個數的位置而直接得到另一個表示式。
  試程式設計求解自然數 n 可以寫成多少種本質不同的質數和表示式。

Input

  每一行存放一個自然數 n , 2≤n≤200

Output

  輸出每一個自然數 n 的本質不同的質數和表示式的數目

Sample Input

Sample Output

這其實就是揹包問題的方案總數,不過要加多一個篩素數的過程。
s[j]表示不超過j的最大方案數,狀態轉移方程為:
s[j]=s[j]+s[j-a[i]]
(1<=i<=k,a[i]<=j<=n)
s[n]即為所求。
時間複雜度:O(n^2)

var
  a,s:array[0..200]of longint;
  f:array[0..200]of boolean;
  n,i,j,k:longint;
begin
  readln(n);
  fillchar(f,sizeof(f),true);
  f[1]:=false;
  for i:=2 to n do
    if f[i] then for j:=2 to n div i do
                   f[i*j]:=false;
  for i:=1 to n do
    if f[i] then begin inc(k); a[k]:=i; end;
  s[0]:=1;
  for i:=1 to k do
    for j:=a[i] to n do
      s[j]:=s[j]+s[j-a[i]];
  writeln(s[n]);
end.

版權屬於: Chris

轉載時必須以連結形式註明原始出處及本宣告。