• zoj 1149 Dividing


    刚开始,将输入的每种价值的大理石都%2。以为是剪枝,后来和同学交流才发现,当数据为 0 0 2 0 0 1 是错误的。改了一下代码才AC。下次不要犯这些小错误了……
    
    #include "stdio.h"
    #include "string.h"
    //ave每个人应该获得大理石价值
    //a1-a6记录各种大理石数量
    //flag状态标记,1为可以均分,0为不可以
    int ave,a[7],flag;
    void find(int ans,int s)//ans当前总和,s开始搜索的大理石价值
    {
        int i;
        if(flag) return;
        if(ans==ave)//达成目标返回
        {
            flag=1;
            return;
        }
        for(i=s; i>=1; i--)
        {
            if(a[i])
            {
                if(ans+i<=ave)
                {
                    a[i]--;
                    find(ans+i,i);//进行下一次搜索
                    if(flag) break;//找到答案,结束循环
                }
            }
        }
    
        return;
    }
    int main()
    {
        int i,cas=0,sum,max;
        while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]))
        {
            cas++;
            sum=0;
            if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0) break;
            printf("Collection #%d:
    ",cas);
            flag=0;
            for(i=1; i<=6; i++)     sum+=i*a[i];//计算大理石总和
            if(sum%2!=0)//剪枝,sum为奇数排除
            {
                printf("Can't be divided.
    
    ");
                continue;
            }
            ave=sum/2;
            find(0,6);//开始搜索
            if(flag==1) printf("Can be divided.
    
    ");
            else printf("Can't be divided.
    
    ");
        }
        return 0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    解题报告:luogu P1156
    解题报告:AT3605
    矩阵乘法与斐波那契数列
    九、模块
    八、异常
    七、文件处理
    六、对象和内存分析
    五、函数和内存分析
    四、控制语句
    三、序列
  • 原文地址:https://www.cnblogs.com/xryz/p/4848120.html
Copyright © 2020-2023  润新知