poj-1011

来源:互联网 发布:android基站定位源码 编辑:程序博客网 时间:2024/04/27 22:44
题意:

木棒复原,输入n,再输入n个木棒长度,求原来木棒长度最小为多少

解题思路:

dfs+回溯

具体代码:

#include<iostream>#include<algorithm>using namespace std;int n;int cmp(int a,int b){    if(a>b)        return 1;    else        return 0;}int dfs(int *stick,bool *vist,int len,int initlen,int s,int num){    if(num==n)        return true;            int sample=-1;        for(int i=s;i<n;i++)    {        if(vist[i]||stick[i]==sample)            continue;                    vist[i]=true;        if(len+stick[i]<initlen)        {            if(dfs(stick,vist,len+stick[i],initlen,i,num+1))                return true;            else                sample=stick[i];        }        else if(len+stick[i]==initlen)        {            if(dfs(stick,vist,0,initlen,0,num+1))                return true;            else                sample=stick[i];        }        vist[i]=false;        if(len==0)            break;    }    return false;}int main(){    while(cin>>n && n)    {        int *stick=new int[n];        bool *vist=new bool[n];        int sumlen=0;        for(int i=0;i<n;i++)        {            cin>>stick[i];            sumlen+=stick[i];            vist[i]=false;        }        sort(stick,stick+n,cmp);        int maxlen=stick[0];//所有木棒中最长的        bool flag=false;        for(int initlen=maxlen;initlen<=sumlen-initlen;initlen++)        {            if(!(sumlen%initlen)&&dfs(stick,vist,0,initlen,0,0))            {                cout<<initlen<<endl;                flag=true;                break;            }        }        if(!flag)            cout<<sumlen<<endl;        delete stick;        delete vist;    }    return 0;}
View Code

 

0 0
原创粉丝点击