Gym - 101164I dfs

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("");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值