Gym

来源:互联网 发布:winaip阅读器软件下载 编辑:程序博客网 时间:2024/06/06 08:32

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("");    }}
原创粉丝点击