蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把乙個正整數 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 ...