hdu 1028整數劃分

2021-07-23 13:53:40 字數 1093 閱讀 9546

1、母函式

杭州電子科技大學課件

演算法就是簡單的模擬,

(1+x+x^2+x^3+...)(1+x^2…+x^4+x^6+...)(

1+x^3…+x^6+x^9+)...(...)

=[1*(1+x^2…+x^4+x^6+...)

+x*(1+x^2…+x^4+x^6+...)

+x^2*(1+x^2…+x^4+x^6+...

]*(1+x^3…+x^6+x^9+)...(...)

#include #include #include using namespace std;

const int maxn=125;

int main()

for(int i=2;i<=n;++i)

}for(int j=0;j<=n;++j)

}printf("%d\n",a[n]);

}return 0;

}2、dp

a.遞迴,會超時,但比較好理解

設n的乙個劃分為,其中m=max

dp(n,m)表示n的劃分中最大的數不超過m的方案數

則dp(n,m)有以下幾種情況

(1)n==1,只有一種劃分即;

(2)m==1,只有一種劃分即n個1,;

(3)nm,根據劃分中是否包含最大值m,可以分為兩種情況:

劃分中包含m的情況,即}, 其中 的和為n-m,可能再次出現m,因此是(n-m)的m劃分,因此這種劃分個數為f(n-m, m);

劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數為f(n,m-1);因此 f(n, m) = f(n-m, m)+f(n,m-1);

#include #include using namespace std;

const int maxn=125;

int dp[maxn][maxn];

int f(int n,int m)//遞迴會超時

int main()

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

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

}return 0;

}

HDU 1028 數的劃分

題意,問乙個數最多可以劃分為多少種,不考慮順序。思路 設dp i j 表示把i劃分為j種有多少種劃法,可以把情況分為兩種,一種每份中都不含1,把每份都減去1,相當於把i j分為j份,即dp i j j 一種至少含乙個1,把那個1減去,相當於把i 1分為j 1份,即dp i 1 j 1 所以dp i ...

HDOJ 1028 整數劃分

大概思路是開2個陣列,c1 儲存當前得到的多項式各項係數,c2 儲存每次計算時的臨時結果,當每次計算完畢後,把它賦給c1,然後c2清零。計算的時候,開3層for迴圈。最外層,記錄它正在與第幾個多項式相乘。第二層,表示c1中的每一項,第三層表示後面被乘多項式中的每一項。include include ...

HDU 1028 母函式解 完全揹包解

初學母函式,練練手 母函式解 求整數n的整數拆分方法 題目理解為 將數字1 2 3 n 每個數字可以選取無限次,求能組成n的情況總數 函式 1 x x 2 x 3 1 x 2 x 4 1 x 3 x 6 x 9 第一項的意義是 取0個1,取1個1 2個1,3個1 第二項的意義是 取0個2,取1個2 ...