题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1398
题目大意:
一个国家的硬币都是方形的,面值也是方形的
有1块钱,4块钱,9块钱,16块钱......一直到289块钱(17^2)
问想组成n块钱有几种方法。
思路:模板题
#include<bits/stdc++.h>
#define LL long long
using namespace std;
//n*p*logn
struct Function{
int n1[2005], n2[2005], v[2005];
int a[2005], b[2005];
int getfun(int k, int p){//物品数 组成p的方案数
memset(a, 0, sizeof(int)*(p+1));
a[0]=1;
int last=0;
for(int i=1; i<=k; i++){
int last2=min(last+n2[i]*v[i], p);
memset(b, 0, sizeof(int)*(last2+1));
for(int j=n1[i]; j<=n2[i]&&j*v[i]<=last2; j++){
for(int k=0; k<=last&&k+j*v[i]<=last2; k++){
b[k+j*v[i]]+=a[k];
}
}
memcpy(a, b, sizeof(int)*(last2+1));
last=last2;
}
return a[p];
}
}fun;
int main() {
for(int i=1; i<=17; i++){
fun.v[i]=i*i, fun.n1[i]=0, fun.n2[i]=305;
}
fun.getfun(17,305);
int n;
while(~scanf("%d", &n)){
if(n==0) return 0;
printf("%d\n", fun.a[n]);
}
return 0;
}
京公网安备 11010502036488号