pta 整數拆分

2021-10-03 07:15:03 字數 1314 閱讀 8644

給定乙個整數n,將其無序拆分成最大數為k的拆分數,(n,k不超出100) 要求:所有的拆分方案不重複。 如當n=4,k=4時,一共有5種拆分方案,拆分如下:

(1)

4=1+

1+1+

1(2)

4=1+

1+2(

3)4=

1+3(

4)4=

2+2(

5)4=

4

輸入格式:

每一行輸入一組整數n,k,遇到鍵盤結束符^z或檔案結束符eof時結束輸入。

輸出格式:

按行輸出每組的拆分方案數。

這個題和整數拆分各項和不一樣

本來打算用深搜做

只有第乙個能過

錯誤**

#include

int ans,sum,n,k;

void

dfs(

int x)

if(sum>n)

return

;for

(int i=x;i<=k;i++)}

intmain()

return0;

}

後來看了下別人的**

2. 動態規劃

既然暴力的方法行不通,那麼我們就該換種思路了。實在沒有思路的時候我們可以嘗試手動計算出n,k都較小時的拆分方案數。結果我們不難發現以下幾條規律。

當n==1時,無論k為何值,都只有一種拆分方案。即。

當k==1時,無論n為何值,都只有一種拆分方案。即。因為拆分的最大數不能超過k,所以只能拆成1。

當n==k時,根據拆分出來的數是否包含n,可以分成兩種情況。

拆分出來的整數包含n,那就只有一種情況,即。

拆分出來的整數不包含n,那麼這些拆分出來的數中,一定比n小,即n的所有(n-1)拆分。因此dp[n][k]=1+dp[n][k-1];

當n當n>k時,根據拆分出來的整數中是否包含k,可以分為兩種情況:

拆分出來的整數中包含k,即),其中的和為n-k,可能再次出現k,因此是(n-k)的k拆分。因此這種情況的拆分數是dp[n-k][k]。

拆分出來的整數中不包含k的情況,則拆分出來的整數中所有值都比k小,即n的(k-1)劃分。拆分數為dp[n][k-1]。

所以dp[n][k]=dp[n-k][k]+dp[n][k-1]。

#include

intmain()

}printf

("%d\n"

,dp[n]

[k]);}

return0;

}

PTA 整數拆分

將乙個正整數拆分成若干個正整數的和。輸入格式 乙個正整數n 輸出格式 若干行,每行乙個等式 每個數或者等號間都有乙個空格,第乙個數前沒有空格,最後乙個數後面沒有空格,數與數之間要求非降序排列 最後一行給出解的總個數 輸入樣例 在這裡給出一組輸入。例如 4輸出樣例 在這裡給出相應的輸出。例如 4 1 ...

PTA 整數拆分

將乙個正整數拆分成若干個正整數的和。輸入格式 乙個正整數n 輸出格式 若干行,每行乙個等式 每個數或者等號間都有乙個空格,第乙個數前沒有空格,最後乙個數後面沒有空格,數與數之間要求非降序排列 最後一行給出解的總個數 輸入樣例 在這裡給出一組輸入。例如 4輸出樣例 在這裡給出相應的輸出。例如 4 1 ...

PTA 整數拆分

整數拆分 將乙個正整數拆分成若干個正整數的和。輸入格式 乙個正整數n 輸出格式 若干行,每行乙個等式 每個數或者等號間都有乙個空格,第乙個數前沒有空格,最後乙個數後面沒有空格,數與數之間要求非降序排列 最後一行給出解的總個數 輸入樣例 在這裡給出一組輸入。例如 4輸出樣例 在這裡給出相應的輸出。例如...