給定乙個整數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輸出樣例 在這裡給出相應的輸出。例如...