#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[N][101], c2[N][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[N][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[n][k];
}
printf("%d\n", res);
}
return 0;
}
HDU 2069 Coin Change (母函数)
转载
问题描述:找硬币问题,有个限制条件,就是总数不能超过100。
思路:将母函数变形,加一维表示数量。
代码:
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:lca 倍增模板
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HDUOJ----Coin Change
Coin ChangeTime Limit: 1000/1000 MS (Java/Oth
HDUOJ java 分治法 ios