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 ...