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:\n",cas);
        flag=0;
        for(i=1; i<=6; i++)     sum+=i*a[i];//计算大理石总和
        if(sum%2!=0)//剪枝,sum为奇数排除
        {
            printf("Can't be divided.\n\n");
            continue;
        }
        ave=sum/2;
        find(0,6);//开始搜索
        if(flag==1) printf("Can be divided.\n\n");
        else printf("Can't be divided.\n\n");
    }
    return 0;
}



你可能感兴趣的:(zoj 1149 Dividing)