HDU 2069 Coin Change (母函数)
2013-03-01 23:52
369 查看
问题描述:找硬币问题,有个限制条件,就是总数不能超过100。
思路:将母函数变形,加一维表示数量。
代码:
思路:将母函数变形,加一维表示数量。
代码:
#include #include #include #include #include #include #include #include #include #include #include #include #define MID(x,y) ((x+y)>>1) using namespace std; typedef long long LL; int a[5] = {1, 5, 10, 25, 50}; /* generating_function */ const int N = 300; struct generating_function{ int c1 [101], c2 [101]; int maxn; void init(int n){ memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); c1[0][0] = 1; maxn = n; } void cal(int p); }ef; void generating_function::cal(int p){ int tmp [101]; memset(tmp, 0, sizeof(tmp)); for (int i = 0; i <= maxn; i ++){ for (int j = 0; j <= maxn; j += a[p]){ int k1 = j/a[p]; if (i + j <= maxn && c2[j][k1]) for (int k2 = 0; k1+k2 <= 100; k2 ++) tmp[i+j][k1+k2] += c1[i][k2] * c2[j][k1]; } } memset(c1, 0, sizeof(c1)); for (int i = 0; i <= maxn; i ++){ for (int k = 0; k <= 100; k ++){ c1[i][k] = tmp[i][k]; } } return ; } int main(){ int n; while(scanf("%d", &n) == 1){ ef.init(n); for (int i = 0; i < 5; i ++){ memset(ef.c2, 0, sizeof(ef.c2)); for (int j = 0; j <= n; j += a[i]){ ef.c2[j][j/a[i]] = 1; } ef.cal(i); } int res = 0; for (int k = 0; k <= 100; k ++){ res += ef.c1 [k]; } printf("%d\n", res); } return 0; }
相关文章推荐
- hdu 2069 Coin Change (母函数)
- hdu 2069 Coin Change (母函数)
- (简单母函数进阶版,暴力)hdu 2069 Coin Change
- HDU 2069 Coin Change (母函数)
- hdu 2069 Coin Change (dp 母函数 )
- 【母函数】HDU-2069 Coin Change
- UVa 674 & hdu 2069 Coin Change (母函数,dp)
- hdu 2069 Coin Change(母函数)
- uva 674 && hdu 2069 coin change(动态规划、母函数)
- HDU 2069 Coin Change【带总数限制的母函数】
- [母函数]HDU 2069 Coin Change
- Hdu-2069_Coin Change
- HDU 2069 母函数模版题
- 【HDU 2069】Coin Change 暴力枚举法
- HDU 2069 母函数模版题
- HDU 2069 Coin Change (暴力)
- HDU-2069-Coin Change
- hdu 2069 限制个数的母函数(普通型)
- HDU 2069 母函数模版题
- hdu 2069 1 5 10 25 50 这几种硬币 一共100个(母函数)