题目传送门:点击打开链接
这道题其实就是模版题,唯一不同的是每一项的指数不同,所以在模版里最外层的 不是i++,而是1,4,9,16....17^2,i代表的是第i种硬币类型,这种类型的硬币能提供价值为i*1,i*2,i*3。。还有不懂的可以看一下代码,如果在不懂我想你可以看一下点击打开链接的博客内容。
#include <iostream>
#include <cstdio>
using namespace std;
int data[]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289};
int c1[1000],c2[1000];
int n;
void init()
{
for(int i=0;i<=n;++i)
{
c1[i]=1;
c2[i]=0;
}
int cnt=2;
for(int i=data[cnt];i<=n&&cnt<=17;i=data[++cnt]) //注意这里 这个代码用g++交会超时,c++不超,也可以改成 for(;cnt<=17;++cnt)
{ // int i=data[cnt];<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
for(int j=0;j<=n;++j) // if(i>n) break
for(int k=0;k+j<=n;k+=i)
c2[k+j]+=c1[j];
// cout<<cnt<<": ";
for(int j=0;j<=n;++j)
{
c1[j]=c2[j],c2[j]=0;
// cout<<c1[j]<<" ";
}
// cout<<endl;
}
}
int main(int argc, const char * argv[])
{
while(scanf("%d",&n)==1)
{
if(!n)
break;
init();
cout<<c1[n]<<endl;
}
return 0;
}