用d[i]表示i个cubes的方法数,递推式为:d[i]=sum{(2^(i-j-4)-d[i-j-4])*2^j|0<=j<=i-3}。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int d[35],p[32];
int main()
{
p[0]=1;
for(int i=1;i<=30;i++)
p[i]=p[i-1]*2;
d[0]=d[1]=d[2]=0;
for(int i=3;i<=30;i++)
{
d[i]=0;
for(int j=i-3;j>=0;j--)
{
if(i-j-4<=0) d[i]+=p[j];
else d[i]+=(p[i-j-4]-d[i-j-4])*p[j];
}
}
int n;
while(cin>>n&&n)
{
if(n<=30) cout<<d[n]<<endl;
else cout<<0<<endl;
}
return 0;
}