noip2001 數的劃分 2008 11 5

2021-07-09 20:45:47 字數 1557 閱讀 2671

noip2001-數的劃分 2008.11.5

心得:本以為搜尋過不了,只有dp可以ac,實際上,搜尋也可以過完。

如果實在想不出來

dp,那就用最好的搜尋來做!

法一:搜尋

program sdhf;

const fin='sdhf.in';fout='sdhf.out';

var n,k,sum:longint;

f1,f2:text;

procedure search(n,k,c:longint);

var i,j:longint;

begin

if n=0 then exit;

if k=1 then begin inc(sum);exit;end;

i:=n div k;

for j:=c to i do

search(n-j,k-1,j);

end;

begin

assign(f1,fin);reset(f1);

assign(f2,fout);rewrite(f2);

read(f1,n,k);

sum:=0;

search(n,k,1);

writeln(f2,sum);

close(f1);

close(f2);

end.

法二:dp1

program sdhf;

const fin='sdhf.in';fout='sdhf.out';

var n,i,j,k,p:longint;

f:array[0..200,0..200]of longint;

f1,f2:text;

begin

assign(f1,fin);reset(f1);

assign(f2,fout);rewrite(f2);

read(f1,n,k);

fillchar(f,sizeof(f),0);

f[0,0]:=1;

for p:=1 to n do

for i:=p to n do

for j:=k downto 1 do

inc(f[i,j],f[i-p,j-1]);

writeln(f2,f[n,k]);

close(f1);close(f2);

end.

法三:dp2

分析:用f(i,j)表示將整數i分成j分的分法,可以劃分為兩類:

第一類 :j分中不包含1的分法,為保證每份都》=2,可以先那齣j個1分到每乙份,然後再把剩下的i-j分成j份即可,分法有:f(i-j,j).

第二類 : j份中至少有乙份為1的分法,可以先那齣乙個1作為單獨的1份,剩下的i-1再分成j-1份即可,分法有:f(i-1,j-1).

所以:f(i,j)= f(i-j,j)+ f(i-1,j-1)

遞推公式 f(n,k) = f(n-1,k-1) + f(n-k,k)

NOIP 2001 數的劃分

問題描述 將整數 n 分成 k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。問有多少種不同的分法。輸入 n,k 輸出 乙個整數,即不同的分法。樣例 輸入 7 3 輸出 4 四種分法為 6 n 200,2 k 6 記 f i,j 為 k i n j...

NOIP2001 數的劃分

codevs 1039 1039 數的劃分 2001年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認...

NOIP 2001普及組 數的劃分

題目描述 我們要求找出具有下列性質數的個數 包含輸入的自然數n 先輸入乙個自然數n n 1000 然後對此自然數按照如下方法進行處理 1.不作任何處理 2.在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 4.加上數後,繼續按此規則進行處理,直到不能再加自然數為止。題目分析 看到這道題,最容易...