swust oj1167,swustoj1178
题目传送门
//爆搜加剪枝的过程,自己剪枝太弱了,恶补中
//经典搜索加剪枝
#包括cstdio
#包括字符串
#包含标准库函数
#包括cctype
#包含数学函数
#包括输入输出流
#包含算法
#包含矢量
使用命名空间标准
#定义ll龙龙
const int maxn=70
int L,sum,n;//L表示枚举的每一个可能的长度,总和表示所有棍子的总长度,n表示有多上根棍子
int len[maxn];//记录每根棍子的长度
使用的int[maxn];//每根棍子是否被标记
//bool cmp(常量整型一,常量整型b)
//{
//返回
//}
int cmp(常量void *a,常量void *b)
{
return *(int *)B- *(int *)a;
}
int getInt(int x)
{
返回scanf(%d ,
}
bool dfs(int m,int left)//m为剩余的木棍数,左侧为当前正在拼接的木棍离L的距离差
{
if(m==0 left==0)返回真实的
if(left==0)
{
左=L;//一根刚好拼完,给出新的初始值L
}
for(int I=0;我我)
{
如果(!使用len[i]
{
如果(i 0)
{
如果(!used[i-1] len[i]==len[i-1])
继续;
}
已用[I]=1;
if(dfs(m-1,left-len[i]))
{
返回真实的
}
其他
{
已用[I]=0;//回溯
if(left==len[i]left==L)
返回错误的
}
}
}
返回错误的
}
int main()
{
而(获取(名词)
{
sum=0;
for(int I=0;我我)
{
getInt(len[I]);
sum=len[I];
}
bool ok=false
qsort(len,n,sizeof(len[0]),CMP);
//sort(len,len n,CMP);
//cout sum endl;
for(L=len[0];l=sum/2;L )//再往上就是一根棍子了,这里显然是一个剪枝
{
if(总和%L)继续;//sum%l!=0则不可能是通过长度相等的棍子裁剪而来,剪枝
memset(used,0,sizeof(used));//每次搜索都要初始化超声萃取水蒸气蒸馏
if(dfs(n,L))
{
ok=真
printf(%d\n ,L);
打破;
}
}
如果(好==假)
printf(%d\n ,sum);
}
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。