day3 HDU 1455 Sticks

来源:互联网 发布:js md5加密 php解密 编辑:程序博客网 时间:2024/05/20 04:49

题目要求是拼木棍,求能拼出的最短长度。因为选择比较多,考虑长度从小到大进行DFS,但是这道题有很多可以剪枝的地方。

1.对数组进行排序,从较大的木棍开始拼

2.长度一定是可以整除总长度的

3.长度最长不会超过总长度的一半

4.注意随时进行判断,如果剩下的木棍无法拼成了就立即退出。

#include"iostream"#include"algorithm"using namespace std;int v[100],s[100];int w;int n,sum,k;int cmp(int a,int b){    return a>b;}int dfs(int les,int x,int sl){    if(les==0)    {        sl-=k;        if(sl==0) return 1;        int i=0;        while(v[i]) i++;        v[i]=1;        if(dfs(k-s[i],i+1,sl)) return 1;        v[i]=0;        sl+=k;    }    else    {        for(int i=0;i<n;i++)        {            if(i>0&&(s[i]==s[i-1]&&!v[i-1])) continue;            if(!v[i]&&s[i]<=les)            {                les-=s[i];                v[i]=1;                if(dfs(les,i,sl)) return 1;                v[i]=0;                les+=s[i];                if(s[i]==les||les==k) break;            }        }    }    return 0;}int main(){    while(1)    {        cin>>n;        if(n==0) break;        sum=0;        for(int i=0;i<n;i++) { cin>>s[i]; sum+=s[i]; v[i]=0;}        sort(s,s+n,cmp);            int flag=0;        for(k=s[0];k<=sum/2;k++)        {            if(sum%k==0)            {                if(dfs(k,0,sum))                {                    flag=1;                    cout<<k<<endl;                    break;                }            }        }        if(flag==0)            cout<<sum<<endl;        //cout<<k<<endl;    }}


0 0
原创粉丝点击