题意:

木棒复原,输入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

 

posted on 2014-05-21 12:29  903SW-BAO  阅读(145)  评论(0编辑  收藏  举报