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

2021-09-25 19:02:02 字數 1168 閱讀 6849

劃分整數

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

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

輸入格式

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

輸出格式

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

樣例輸入

5 3樣例輸出

5解題思路:

可設dp[n][k]表示將正整數n分解為不多於k個正整數相加的形式的方案數。根據題意,應分以下4種情況討論:

1°n=1 或 k=1:n=1時只有"1=1"這1種分解方案;k=1時只有"n=n"這1種分解方案,故方案數=1;

2°n3°n>k:根據"是否將n恰好分解為k個正整數相加的形式"(上界),進行討論:

1°°將n恰好分解為k個正整數相加的形式:此時分解出的每個正整數t都滿足t>=1,故相當於將分解出的k個數"都減去1",即相當於dp[n-k][k],也就是將正整數n-k分解為不多於k個正整數相加的形式的方案數;

2°°將n分解為小於k個正整數相加的形式:此時即dp[n][k-1],也就是將正整數n分解為不多於k-1個正整數相加的形式的方案數;

故方案數=dp[n-k][k]+dp[n][k-1];

4°n=k:總體與3°相同,但將n恰好分解為k個正整數相加的形式時,只有"n=n/k+n/k+...+n/k"這1種分解方案,故方案數=1+dp[n][k-1]。

綜上,可得以下結論:

滿分**如下:

#includeusing namespace std;

typedef long long ll;

const int n=310;

ll dp[n][n];

int main()else if(j>i)else if(i>j)else if(i==j)

} }printf("%lld\n",dp[n][k]);

return 0;

}

計蒜客 劃分整數(dp)

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

計蒜客 基礎dp 劃分整數

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

計蒜客 逃生(基礎動態規劃)

蒜頭君在玩一款逃生的遊戲。在乙個 n times mn m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v...