2018 藍橋杯省賽 B 組模擬賽(五)整數劃分

2021-08-17 21:13:38 字數 1543 閱讀 7960

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把乙個正整數 n

n 分解成不多於 k

k 個正整數相加的形式,那麼一共有多少種分解的方式呢?

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

共一行,包含兩個整數 n(1 \leq n \leq 300)n(

1≤n≤

300)

和 k(1 \leq k \leq 300)k(

1≤k≤

300)

,含義如題意所示。

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

樣例輸入#include

long l
5 3

樣例輸出

5

#include long long  dp[350][350];

int main()

} for(int i = 1 ; i <= n ; i++)

//i==j時 , 分成兩種 , 一種是只由1組成 ,只有一種,另外一種是分成小於j份,即至少有乙份是空;

else if( i == j)

else//i>j時 ,分成j份和小於j份的情況

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

return 0;

}

整數劃分

1.將n分為不大於m的數相加

將 i 分成有 j 和無 j 的情況 (可重複)

dp[i][j] = dp[i-j][j] + dp[i][j-1];(i >= j)

dp[i][j] = dp[i][i](i < j)

將 i 分成有 j 和無 j 的情況 (不重複)

dp[i][j] = dp[i-j][j-1] + dp[i][j-1];(i >= j)

dp[i][j] = dp[i][i](i < j)

2.將n 分為不大於k個數之和

將 i 分成有 1 和無 1 的情況(可重複) 

先將 i 中減去 j 的數量 , 再平分 j 中, 則為沒有1的情況

留乙個為 1 , 其他的繼續分

dp[i][j] = dp[i-j][j] + dp[i-1][j-1](i >= j)

dp[i][j] = dp[i][i](i < j)

將 i 分成有 1 和無 1 的情況(不重複)

dp[i][j] = dp[i-j][j-1] + dp[i-1][j-1](i >= j)

dp[i][j] = dp[i][i](i < j)

3.將i分成若干個奇數之和 

j為奇數時: 

dp[i][j] = dp[i-j][j] + dp[i][j-1](i <= j)

dp[i][j] = dp[i][i](i < j)

j為偶數時:

dp[i][j] = dp[i][j-1];

2018 藍橋杯省賽 B 組模擬賽(一)

給你乙個序列,請你在其中求出一段最長嚴格上公升的部分,它不一定要連續。include includeusing namespace std int f 10000 b 10000 int lis int n res max res,f i return res 1 int main printf d...

2018 藍橋杯省賽 B 組模擬賽(五)矩陣求和

給你乙個從 n times nn n 的矩陣,裡面填充 1 1 到 n times nn n 例如當 n n 等於 3 3 的時候,填充的矩陣如下。1 2 3 4 5 6 7 8 9 現在我們把矩陣中的每條邊的中點連起來,這樣形成了乙個新的矩形,請你計算一下這個新的矩形的覆蓋的數字的和。比如,n 3...

2018 藍橋杯省賽 B 組模擬賽(五)合併數字

題目鏈結 蒜頭君得到了 nn 個數,他想對這些數進行下面這樣的操作,選出最左邊的相鄰的差的絕對值為 11的兩個數,只保留較小的數,刪去較大的數,直到沒有兩個相鄰的差的絕對值為 11 的數,問最多可以進行多少次這樣的操作?輸入第一行為乙個整數 n 1 leq n leq 10 5 n 1 n 105 ...