hdu 1398 Square Coins 母函数+完全背包

来源:互联网 发布:u盘低格后数据恢复 编辑:程序博客网 时间:2024/06/11 13:44

题目链接



思路:

还是典型的母函数的问法,改改板子就能过.这个题目变成了平方.

我们还是用x表示coin,可以构造这样一个母函数:(1+x+x^2+x^3.....)(1+x^4+x^8+...)(1+x^9+x^18+.....).....

注意到这里是的指数和第i个表达式是平方的关系,所以我们将板子对应的改成i*i<=n,k+=i*i即可。

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define inf 0x3f3f3f3f#define exp 0.00000001#define  pii  pair<int, int>#define  mp   make_pair#define  pb   push_backusing namespace std;typedef long long ll;const int maxn=1e5+10;int n;int ans1[301],ans2[301];int main(){while(~Ri(n)&&n){for(int i=0;i<=n;i++){ans1[i]=1;ans2[i]=0;}for(int i=2;i*i<=n;i++){for(int j=0;j<=n;j++){for(int k=0;k+j<=n;k+=i*i){ans2[k+j]+=ans1[j];}}for(int j=0;j<=n;j++){ans1[j]=ans2[j];ans2[j]=0;}}Pi(ans1[n]);} return 0;}



老方法,完全背包一样水过...

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define inf 0x3f3f3f3f#define exp 0.00000001#define  pii  pair<int, int>#define  mp   make_pair#define  pb   push_backusing namespace std;typedef long long ll;const int maxn=1e5+10;int cost[20];int dp[500]; int main(){int n;CLR(cost,0);for(int i=1;i<=17;i++)cost[i]=i*i;while(~Ri(n)&&n){CLR(dp,0);dp[0]=1;for(int i=1;i<=17;i++){for(int j=cost[i];j<=n;j++)dp[j]+=dp[j-cost[i]];}Pi(dp[n]);} return 0;}