大理石分割(回溯法)

大理石分割

题目描述

有若干块大理石,其大小及美观程度不一,为了比较客观的分割这些大理石,我们需要先给这些大理石一个评分,评分分为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容器的大理石的总评分。
在这里插入图片描述

SUM=

代码

#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;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值