您的位置:首页 > 其它

PKU 1020

2014-04-20 21:19 211 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
int l,d[42],c[11],n;
bool dfs(int num)
{
int i,j,minpoint=41,lie;
if(num==n)								//当个数为所提供的蛋糕的个数的时候,搜索完毕,输出结果
return true;
for(i=1;i<=l;i++)
{
if(d[i]<minpoint)
{
minpoint=d[i];
lie=i;
}
}
for(i=10;i>0;i--)						//从最大的一块蛋糕开始查找,搜索
{
if(c[i]&&i+minpoint<=l&&i+lie-1<=l)
{
for(j=lie;j<lie+i;j++)
if(d[j]>minpoint)
break;
if(j>=lie+i)
{
c[i]--;
for(j=lie;j<lie+i;j++)
d[j]+=i;
if(dfs(num+1))//dfs
return true;
for(j=lie;j<=lie+i-1;j++)//回溯,回复原来的状态
d[j]-=i;
c[i]++;
}
}
}
return false;
}
int main()
{
freopen("Cake.txt","r",stdin);
int ncase,i,j,k,sum;

scanf("%d",&ncase);
while(ncase--)
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
scanf("%d %d",&l,&n);
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&k);
c[k]++;							//对等大的蛋糕进行计数,统计个数,从而在dfs()函数中进行判断,
//始终从最大的一块蛋糕开始查找,搜索,知道下一个不同大小的蛋糕
sum+=k*k;
}
if(sum!=l*l)
{
printf("HUTUTU!\n");
continue;
}
if(dfs(0))
printf("KHOOOOB!\n");
else
printf("HUTUTU!\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: