計蒜客 基礎dp 劃分整數

2021-09-22 02:35:07 字數 1313 閱讀 7407

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把乙個正整數 n 分解成不多於 k 個正整數相加的形式,那麼一共有多少種分解的方式呢

蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。

共一行,包含兩個整數 n(1≤n≤300) 和 k(1≤k≤300),含義如題意所示。

乙個數字,代表所求的方案數。

樣例輸入複製

5 3
樣例輸出複製

5
對於樣例,55 有 55 種不大於 33 個數的相加方式, 分別是:

dp [i][j] 表示將正整數 i  分解成 j 個正整數相加的方案數. 

這種題目難就難在遞推表示式的分析上 , 首先, 如果 n = 1 , 那麼 不管k 取多少 只有 "  1 "  這種方案合法  , 如果  k = 1 , 不管 n 取值為多少只有 " n " 這種方案合法   ;   當 n  > k 時 拿 上面的例子來說 ,  n = 5 ,  k = 3  , 就是說 將整數 5 分解成 3個數 相加的方案數 , 分兩種情況 , 正好能用 k 個數相加表示 n 的情況 和  用 少於 k 個數相加表示n 的情況 。前一種情況 這k 個數一定都 >=1 ,那麼這k 個數每個數都減去 1 , 這時n 變成了 n-k , 也就是 正整數  n-k 用 k 個數相加表示 , 這時就等價於  n-k 用不少於 k 個數相加表示的方案數  ;  後一種情況 ,此時即dp[n][k-1],也就是將正整數n分解為不多於k-1個正整數相加的形式的方案數

當 n = k 的時候 ,n恰好分解為k個正整數相加的形式時,只有"n=n/k+n/k+...+n/k"這1種分解方案,故方案數=1+dp[n][k-1] . 

n < k 時 沒有合法方案

#include #include #include #include using namespace std ;

const int max = 1005 ;

typedef long long ll ;

ll dp[max][max] ;

int main()

else if(i < j)

else if(i > j)

else

} }cout<

}

計蒜客 劃分整數(dp)

劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nn n 分解成不多於 kk k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1 n ...

計蒜客 劃分整數(動態規劃)

劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nnn 分解成不多於 kkk 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。輸入格式 共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1...

計蒜客 A1634 劃分整數

標籤 計數dp 相似題目 題目蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n 分解成不多於 k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。輸入共一行,包含兩個整數n 1 n 300 和k 1 k 300 含義如題意所示。...