https://vjudge.net/contest/170300#problem/I
dfs//其实这里deep应该是个数的意思把。。。
int st[maxn];
int cnt=0;
bool dfs(int n,int start,int deep){
if(n<0)return 0;
if(deep==0){
if(n==0){
pf("%d\n",cnt);
rep(i,1,cnt){
pf("%d%c",st[i],i==cnt?'\n':' ');
}
return 1;
}
return 0;
}
for(int i=start;i>=1;i--){
if(i*i*i*deep<n)break;
st[++cnt]=i;
if(dfs(n-i*i*i,i,deep-1))return 1;
--cnt;
}
return 0;
}
int main(){
int n;
while(~sf("%d",&n)){
cnt=0;
for(int i=1;i<=n;++i){
if(dfs(n,365,i))break;
}
}
}
个人感觉另一种写法更好看。。
int a[1000];
int tmp[1000];
int ans=0;
void dfs(int now,int n,int mx){
if(n==0){
if(now<ans){
ans=now;
for(int i=0;i<ans;++i){
a[i]=tmp[i];
}
}
}
if(now+1>=ans)return;//说这个简直很减去时间
for(int i=mx;i>=1;i--){
if(i*i*i>n)continue;
if(now+n/(i*i*i)>=ans)return;
tmp[now]=i;
dfs(now+1,n-i*i*i,i);
if(n==i*i*i)return;
}
}
int main(){
int n;
while(~sf("%d",&n)){
ans=inf;
dfs(0,n,365);
pf("%d\n",ans);
rep(i,0,ans-1)pf("%d ",a[i]);
puts("");
}
}