藍橋杯 演算法訓練 數的劃分

2021-08-19 14:55:14 字數 1053 閱讀 4420

問題描述

將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。

例如:n=7,k=3,下面三種分法被認為是相同的。

1,1,5; 1,5,1; 5,1,1;

問有多少種不同的分法。

輸入格式

n,k輸出格式

乙個整數,即不同的分法

樣例輸入

7 3樣例輸出 4

資料規模和約定 6

講道理自己第一眼看上去根本沒當回事,迭代加深搜尋再標記一下前置索引最後把數數出來就行了,然而超時emmm。這才意識到有可能是dp呀,於是一做就是三個小時,死活找不到狀態轉移方程。

後來看了大神的講解,確實還是自己的dp太弱了,以後要多練練了。

首先這道題是乙個跟組合數學有關的題目,我們把它轉化成如下問題:

有n個小球放到k個盒子裡,各個盒子無差別,每個盒子裡必須要有小球,共有幾種放法?

此時我們需要找狀態轉移方程,與之前的簡單dp直接把大問題轉化成小問題不同,本題要把大問題分成兩部分,分別轉化為小問題。這時我們需要討論在此時的放法中是否存在某乙個盒子只有乙個小球的情況:

1.若存在,則該盒子和該小球並不影響放法的種數,於是dp[i][j]=dp[i-1][j-1]

2.若不存在,則每個盒子中都至少有兩個小球,在這種情況下,我們從每個盒子中都拿走乙個小球,也不影響放法的種數。於是dp[i][j]=dp[i-j][j]

結合起來就是大問題放法的種數,可得狀態轉移方程dp[i][j]=dp[i-1][j-1]+dp[i-j][j];

**如下:

#include

#include

#include

#include

#include

using namespace std;

int dp[205][10];

int main()

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

return 0;

}其實不能搜尋的話是蠻難的了,就是如果數學不好很難想到討論是否存在某個盒子只有乙個小球的情況,也就很難找到狀態轉移方程,如果想具備這種思維的話還是要多加練習啊。

藍橋杯 ALGO 22演算法訓練 數的劃分

問題描述 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 n,k輸出格式 乙個整數,即不同的分法 樣例輸入 7 3樣例輸出 4資料規模和約定6 分析 遞迴問題,ste...

藍橋杯 演算法練習 數的劃分

這個題目感覺到了用動態規劃,但是奈何組合數學的不好,沒有寫出狀態轉移方程 參考乙個博主的部落格,寫出了滿分 還特意搜了一下斯特林數,學到了學到了 詳細解答在博主的部落格裡 鏈結如下 這是一道不太一樣的dp題,他的邊界在遞推的中間,而且還要注意每一維度的範圍,否則知道狀態轉移方程也寫不出來 算是比一般...

藍橋杯 演算法訓練 回文數

問題描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個10進製數56,將56加65 即把56從右向左讀 得到121是乙個回文數 又如 對於10進製數87 s te p1 step1 step 1 87 78 165 ste p2 step2 step 2...