hdu 1445 dfs剪枝,hdu1445

來源:互聯網
上載者:User

hdu 1445 dfs剪枝,hdu1445


題意比較簡單;重點在剪枝上。


#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;int n,num[70],mark[70],k,flash;int dfs(int s,int ii,int t,int c){    if(t==c)    {        flash=1;        return 1;    }    if(flash) return 0;    if(s==k)    {        dfs(0,1,t+1,c);        //return 1;    }    else    {        int i;        for(i=ii;i<=n;i++)        {            if(s+num[i]>k) continue;            if(mark[i]) continue;            mark[i]=1;            dfs(s+num[i],i+1,t,c);            mark[i]=0;            if(s==0) return 0;//如果當前是第一個木棍但是沒有用上 很明顯不能存在答案  在時間上是個大最佳化            while(num[i+1]==num[i]) i++;//當前這個數沒用上則與他相等的也用不上                        if(flash) return 0;        }    }    return 0;}int cmp(int a,int b){    return a>b;}int main(){    int i,j;    while(~scanf("%d",&n),n)    {        int Max=0,sum=0;        for(i=1;i<=n;i++)        {            scanf("%d",&num[i]);            sum+=num[i];            if(Max<num[i]) Max=num[i];        }        //printf("%d\n",sum);        sort(num+1,num+1+n,cmp);        flash=0;        for(i=n;i>=1;i--)        {            if(sum%i!=0) continue;            k=sum/i;            //printf("%d \n",i);            if(k<Max) continue;            memset(mark,0,sizeof(mark));            dfs(0,1,0,i);            if(flash) break;            }        printf("%d\n",k);    }        return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.