您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: