http://poj.org/problem?id=1020
题意:给定一块size*size 的生日蛋糕,并给出一些人的需要的蛋糕大小,问是否能将蛋糕完全切分给所有人而没有一点浪费。
思路:dfs搜索,思路很好。蛋糕的摆放顺序从上至下,每次都寻找所有列中摆放蛋糕最少的一列摆放蛋糕,这样搜索就可以过了。
代码:
#include<stdio.h>
#include<string.h>
int T ,size ,piece ;
int cake[15] ,len[200];
bool dfs(int pos){
if( pos == piece ) return true ;
int _min = 200000, min_n ;
for(int i=0;i<size;i++){ //选出最少蛋糕的列摆放
if(_min > len[i]){
_min = len[i] ;
min_n = i ;
}
}
for(int i=1;i<=10;i++){ // size of the cake
if(cake[i]==0 || min_n+i>size || len[min_n]+i>size) continue ;
bool ok = 1 ;
for(int j=min_n ; j<min_n+i;j++){
if(len[j] > len[min_n]){
ok = 0 ; break ;
}
}
if(!ok) continue ;
cake[i] -- ;
for(int j=min_n ;j<min_n+i;j++){
len[j] += i ;
}
if( dfs(pos+1) ) return true ;
cake[i] ++ ;
for(int j=min_n ;j<min_n+i;j++){
len[j] -= i ;
}
}
return false ;
}
int main(){
int a ,sum;
scanf("%d",&T) ;
for( int cas=1;cas<=T ;cas++) {
memset(cake , 0 ,sizeof(cake));
memset( len , 0 ,sizeof(len) );
sum = 0 ;
scanf("%d %d",&size,&piece);
for(int i=0;i<piece;i++){
scanf("%d",&a);
cake[a]++ ;
sum += a*a ;
}
if(sum != size*size || !dfs(0) ){
printf("HUTUTU!\n");
}
else{
printf("KHOOOOB!\n") ;
}
}
return 0;
}