搜索例题

Author Avatar
Axell 1月 29, 2019
  • 在其它设备中阅读本文章

小木棍

进阶指南P102

#include<bits/stdc++.h>
using namespace std;

int m,sum,n,a[70],tmp[70],len,cnt,ans,mt,y;

bool dfs(int now,int l,int last){
    if (now>cnt) return 1;
    if (l==len) return dfs(now+1,0,1);
    int ch=0;
    for (int i=last;i<=n;++i){
        if (!tmp[i] && l+a[i]<=len && ch!=a[i]){
            tmp[i]=1;
            if (dfs(now,l+a[i],i+1)) return 1;
            tmp[i]=0;
            ch=a[i];
            if (l==0 || l+a[i]==len) return 0;
        }
    }
    return 0;
}

bool cmp(int x,int y){return x>y;}

void solve(){
    sum=n=mt=0;
    for (int i=1;i<=m;++i){
        int tmp;
        scanf("%d",&tmp);
        if (tmp<=50){
            n++;
            a[n]=tmp;
            sum+=tmp;
            mt=max(mt,tmp);
        }
    }
    sort(a+1,a+n+1,cmp);
    memset(tmp,0,sizeof(tmp));
    for (int i=mt;i<=sum;++i){
        if (sum%i==0){
            len=i;
            cnt=sum/len;
            if (dfs(1,0,1)){
                cout<<i<<endl;
                return;
            }
        }
    }
}

int main(){
    while (scanf("%d",&m)!=EOF){
        if (m==0) return 0;
        solve();
    }
    return 0;
}

生日蛋糕

进阶指南P105

#include <bits/stdc++.h>
using namespace std;

int minv[25],mint=1e9,m,v;

int maxv(int n,int r,int h){
    int ret=0,i;
    for (i=n,r--,h--;i<=m;++i,r--,h--){
        ret+=r*r*h;
        if (ret>=10000||r*r*h>=10000) return 10000;
    }
    return ret;
}

void dfs(int n,int lr,int lh,int nv,int ns){
    if (ns>=mint) return;
    else if(nv+minv[m-n+1]>v) return;
    else if(nv+maxv(n,lr,lh)<v) return;
    if (n==m){
        for (int r=lr-1;r>=1;--r){
            if ((v-nv)%(r*r)) continue;
            else{
                int tmp=(v-nv)/(r*r);
                if (tmp<lh){
                    int tt=ns+2*r*tmp;
                    if (m==1) tt+=r*r;
                    mint=min(mint,tt);
                }
            }
        }
        return;
    }
    for (int r=lr-1;r>=m-n+1;--r){
        for (int h=min(lh-1,(int)((v-nv)/(r*r)));h>=m-n+1;--h){
            if (n==1) dfs(2,r,h,r*r*h,r*r+r*h*2);
            else dfs(n+1,r,h,nv+r*r*h,ns+2*r*h);
        }
    }
}

int main(){
    cin>>v>>m;
    for (int i=1;i<=m;++i){
        minv[i]=minv[i-1]+i*i*i;
    }
    dfs(1,sqrt(v),v,0,0);
    cout<<mint<<endl;
    return 0;
}

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接:https://hs-blog.axell.top/archives/88/