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.加上數後,繼續按此規則進行處理,直到不能再加自然數為止。題目分析 看到這道題,最容易...