大理石分割
题目描述
有若干块大理石,其大小及美观程度不一,为了比较客观的分割这些大理石,我们需要先给这些大理石一个评分,评分分为6个等级,分别用1~6的数字来表示。现希望将这些大理石分成两部分,使每部分的评分之和相同。
输入:
输入一行,包括6个数,分别是每个等级的大理石的数量。每种等级的大理石数量不超过20000.
输出:
如果这些大理石能否分割成评价等级之和相同的两部分,则输出true,否则输出false.
样例输入:
1 0 1 2 0 0
样例输出:
false
算法分析
采用回朔法,用Score[6]来存储各个评分的大理石数量。用A[6]和B[6]来表示两个容器,A[i]表示(i+1)评分的大量石在A中分配的数量,则B[i]=Score[i]-A[i];用SUMA和SUMB来表示已分配给A和B容器的大理石的总评分。
代码
#include <stdio.h>
#define n 6
/*
回溯法
/
int up;//上界
int SUM=0;//总评分值
int predict(int score[n],int i,int A[n],int B[n],int SUMA,int SUMB)
{
int flag=0;//用于标记是否找到一种分配方案,若找到程序结束直接结束该函数
if(i==n)
{
return 0;
}
int j=0;
while(j<=score[i])
{
int SUMA1=SUMA;
int SUMB1=SUMB;
A[i]=j;
B[i]=score[i]-j;
SUMA1+=A[i](i+1);
SUMB1+=B[i]*(i+1);
if(SUMA1= =up)
{
printf(“true\n”);
for(int i=0;i<n;i++)
printf("%d等级的石头分配:%d %d\n",i+1,A[i],score[i]-A[i]);
return 1;
}
if(SUMB1= =up)
{
printf(“true\n”);
for(int i=0;i<n;i++)
printf("%d等级的石头分配:%d %d\n",i+1,score[i]-B[i],B[i]);
return 1;
}
else if(SUMA1<up&&SUMB1<up)
{
if(predict(score,i+1,A,B,SUMA1,SUMB1))
{
flag=1;
break;
}
}
j++;
}
if(flag==1)return 1;
else return 0;
}
int main(int argc, char argv[])
{
int score[n]={1,0,1,0,0,0};
int A[n],SUMA=0,B[n],SUMB=0;
//用于存储分配数据及每组评分总值。
for(int i=0;i<n;i++)
{
SUM+=score[i](i+1);
A[i]=B[i]=0;
}
if(SUM%2){
printf(“false”);
return 1;
}
up=SUM/2;
if(!predict(score,0,A,B,SUMA,SUMB))printf(“false”);
return 0;
}