蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把乙個正整數 n 分解成不多於 k 個正整數相加的形式,那麼一共有多少種分解的方式呢對於樣例,55 有 55 種不大於 33 個數的相加方式, 分別是:蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。
共一行,包含兩個整數 n(1≤n≤300) 和 k(1≤k≤300),含義如題意所示。
乙個數字,代表所求的方案數。
樣例輸入複製
5 3樣例輸出複製5
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 含義如題意所示。...