wikioi 數的劃分

2022-04-11 04:48:26 字數 841 閱讀 7941

劃分型dp。最終的思路是,f[i][j]表示i分成j份,如果分出來的有1,那麼去掉1,就是f[i-1][j-1];如果沒有1,那就都減1,就是f[i-j][j](注意此時i>=2j)。那麼f[i][j]=f[i-1][j-1]+f[i-j][j]

詳細些的話,以sample為例:

7=5+1+1;

7=2+4+1;

7=3+3+1;

7=2+2+3;

我們可以把所有數的拆分分成2種情況,有1和沒有1的2種

那麼有1的部分全部減去1,變成

6=5+1;

6=2+4;

6=3+3;

這就是6的所有劃分成2部分的劃分了。

沒有1的,我們把沒有1的所有因子全部減去1

得到4=1+1+2;

這就是4的所有劃分成3部分的劃分了

這個推導其實一時難以想到,這篇文章裡有個轉化和推導,圖有點意思,雖然最終還是上面的簡潔直接:

關於怎麼想到f[i-j][j]這樣的東西的,某人說,n個球放到k個盒子,因為盒子不為空,那麼我先把每個盒子放乙個球。這也是某種思路的**吧。

#include #include #include #include #define max(a, b) a>b?a:b

#define len_n 205

#define len_k 10

using namespace std;

int f[len_n][len_k];

int n;

int k;

void init()

int dp(int i, int j)

int main()

wikioi 數的劃分

題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6 題解 f i,j ...

Wiki OI 1039 數的劃分

演算法與思路 劃分型dp,遞推 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 因此將n劃分份的一種方法唯一的表示為n1 n2 nk,其中n1 n2 nk.這樣可以形象地把n的k份劃分看作是把n塊積...

A 數的劃分

a 數的劃分 將整數n 分成 k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 第一行有兩個整數 n,k 6sample input 7 3 sample output 解題思路...