POJ 1011 Sticks

POJ 1011 Sticks

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

DFS

题意是让你把这些木棍组合成长度相等的一些木棍。要求长度最短。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[65],n,sum,ans;
bool v[65],ok;
bool cmpa(int a,int b)
{
    return a>b;
}
bool dfs(int num,int need,int total)
{
    int i;
    if(need==0)
    {
        if(total==sum/ans-2)return 1;
        for(i=0;v[i];i++);
        v[i]=1;
        if(dfs(i+1,ans-a[i],total+1))return 1;
        v[i]=0;
        return 0;
    }
    else
    {
        if(num>=n-1)return 0;
        for(i=num;i<n;i++)
        {
            if(a[i]==a[i-1]&&!v[i-1])
            continue;
            if(!v[i]&&a[i]<=need)
            {
                v[i]=1;
                if(dfs(i,need-a[i],total))return 1;
                v[i]=0;
            }
        }
        return 0;
    }
}
int main()
{
    while(scanf("%d",&n),n)
    {
        sum=ans=0;
        for(int i=0;i<n;i++)
        scanf("%d",&a[i]),sum+=a[i];
        sort(a,a+n,cmpa);
        memset(v,0,sizeof(v));
        ok=0;
        for(ans=a[0];ans<=sum/2;ans++)
        {
            if(sum%ans==0)
            {
                v[0]=1;
                if(dfs(0,ans-a[0],0))
                {printf("%d\n",ans);ok=1;break;}
            }
        }
        if(!ok)
        printf("%d\n",sum);
    }
    return 0;
}

还有更强大的剪枝版本号的:

#include<cstdio>
#include<cstring>
#include<cstring>
#define MAX 64
int s[MAX],vis[MAX],n,len,sum;
void input()
{   int i,j,temp;
    sum = 0;
       for(i=0;i<n;i++)
         {
            scanf("%d ",&s[i]);
            sum+=s[i];
         }
      for(i=1;i<n;i++)
       for(j=0;j<n-i;j++)
       {
           if(s[j]<s[j+1])
          {
           temp = s[j];
           s[j] = s[j+1];
           s[j+1] = temp;
          }
       }
}
bool dfs(int now_len,int i,int count)
{
    if((count+1)*len==sum)
    {
        return true;
    }
    for(int k= i;k<n;k++)
    {
       if(vis[k]) continue;
       if(k&&!vis[k-1]&&s[k]==s[k-1]) continue;
       if(s[k]+now_len>len) continue;
       if(now_len+s[k]==len)
       {
           vis[k]=1;
           bool result = dfs(0,0,count+1);
           vis[k]=0; 
           return result;
       }
       else if(now_len==0)
       {
           vis[k]=1;
           bool result = dfs(s[k],k+1,count);
           vis[k]= 0;
           return result;
       }
       else if(now_len+s[k]<len)
       {
           vis[k] = 1;
           bool result = dfs(s[k]+now_len,k+1,count);
           vis[k] = 0;
           if(result)
           return true;
       }
    }
    return false;
}
int main()
{
    while(scanf("%d",&n),n)
    {
       input();
       for(len=s[0];len<=sum;len++)
       {
           if(sum%len) continue;
           memset(vis,0,sizeof(vis));
           if(dfs(0,0,0))
           break;
       }
       printf("%d\n",len);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118378.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 1DCNN实例,代码和结果

    1DCNN实例,代码和结果参考https://blog.csdn.net/yilulvxing/article/details/105028902,有一些小问题,修改后在自己电脑上跑了一遍简单说明几点:数据集result,按照0.8划分为train和test,train又按照0.8进一步划分为trainingsamples和validatingsamples;此案例的归一化只是简单的所有数据除以10000,感觉还需要改进from__future__importprint_functionimport

    2022年5月27日
    42
  • JAVA8 Stream接口,map操作,filter操作,flatMap操作

    JAVA8 Stream接口,map操作,filter操作,flatMap操作这篇,我们来看Stream的一些中间操作,关于中间操作的一些介绍,可以看《JAVA8stream接口中间操作和终端操作》1,filter操作,我们先看方法的定义Stream<T>filter(Predicate<?superT>predicate);这个方法,传入一个Predicate的函数接口,关于Predicate函数接口定义,可以查看《JAV…

    2022年5月4日
    37
  • docker部署jenkins安装使用教程_docker搭建python开发环境

    docker部署jenkins安装使用教程_docker搭建python开发环境前言使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装python3的环境。进jenki

    2022年7月31日
    3
  • 大整数乘法C

    大整数乘法C大整数乘法C语言实现希望能帮到你们#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cstring&gt;#defineMAX210usingnamespacestd;intmain(intargc,charconst*argv[]){…

    2022年5月5日
    51
  • 期货软件开发与平台搭建注意事项是什么_手机期货程序化交易软件

    期货软件开发与平台搭建注意事项是什么_手机期货程序化交易软件期货软件开发和期货平台搭建需要注意很多内容,关系到后期运营的是否正常稳定。现在市面上的很多的期货交易系统软件平台,基本都支持支持PC、安卓APP端,微信端、且具备风控系统、杠杆系统、交易系统、在线出入金、后台管理系统、代理系统、股票数据行情等功能。但是行业鱼龙混杂,并不是每一家开发公司都是靠谱的。加wx:“Zhangyoukeji001”发送相关演示版与报价!  作为投资者,要想拥有一个可靠的期货交易系统,需要注意以下几点:前期对期货系统软件的功能规划——针对期货系统软件,要有具体的规划方案,需

    2022年9月10日
    0
  • altium designer绘制51单片机最小系统

    altium designer绘制51单片机最小系统一、绘制51单片机原理图库新建原理图库,并ctrl+s保存起来2、画出方框,并放置引脚,如下图。注意:画出第一个引脚后,可以双击修改它的编号为1,之后再次放置引脚时,编号会自动从1开始自加。3、在方框的左右两边放置引脚注意:新拖出来的引脚,带x号的一端,为将来要与导线连接的一端,所以,这一端要朝芯片的外部。按下空格键,可以实时修改引脚的方向4、编辑引脚定义。点击右下角的SCH,打开库浏览器,双击我们刚才建立好的这个原理图库文件(默认名称为Component_1…

    2022年6月23日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号