您的位置:首页 > 其它

复习笔记之母函数

2016-04-15 16:05 302 查看
HDU 1398 Square Coins

  题意:给 17 种面值的钱币,分别为:1-4-9-。。。-17^2.问 x(x <= 300) 能有多少种不同的兑换方式。

  思考:略~母函数简单模板题目。事实上还可以用完全背包来做。

  

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <queue>
using namespace std ;
const int maxn = 20010 ;
int c1[maxn] , c2[maxn] , sum , N , A[maxn] ;

int main()
{
//    freopen("1.txt","r",stdin) ;
while (scanf("%d",&N) == 1) {
sum = 0 ;
for (int i = 1 ; i <= N ; ++ i) scanf("%d",&A[i]) , sum += A[i] ;
memset(c1,0,sizeof(c1)) ;
memset(c2,0,sizeof(c2)) ;
c1[0] = c1[A[1]] = c1[2*A[1]] = 1 ;
for (int k = 2 ; k <= N ; ++ k) {
for (int i = 0 ; i <= sum*2 ; ++ i) {
for (int j = 0 ; j <= 2  && (i+j*A[k] <= sum*2) ; ++ j)
c2[i+j*A[k]] += c1[i] ;
}
for (int i = 0 ;i <= sum*2 ; ++ i) c1[i] = c2[i] , c2[i] = 0 ;
}
int ans[10010] , cnt = 0 ;
for (int i = sum + 1 ; i <= sum*2 ; ++ i) if (c1[i] == 0) ans[++cnt] = i - sum ;
printf("%d\n",cnt);
for (int i = 1 ; i <= cnt ; ++ i) {
if (i == cnt) printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
}
return 0 ;
}


HDU1709

~end~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: