题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1398
解题方案:利用指数母函数,套模板。
#include <iostream>
#include<cmath>
using namespace std;
const int _max = 100000;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存每一次的情况
int c1[_max], c2[_max];
int table[25];
void mtable()
{
int i;
for(i=1;i<=20;i++)
table[i]=i*i;
}
int main()
{
int i, j, k;
int num;
mtable();
while(cin>>num)
{
if(num==0)
break;
int tmp;
tmp=min(num,17);
for(i=0; i<=num; ++i)
{
c1[i] = 1;
c2[i] = 0;
}
for(i=2; i<=tmp; ++i)
{
for(j=0; j<=num; ++j)
for(k=0; k+j<=num; k+=table[i])
{
c2[j+k] += c1[j];
}
for(j=0; j<=num; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
cout << c1[num] << endl;
}
return 0;
}