항 저 우 전기 hdu 1455 sticks 깊이 우선 검색
3058 단어 깊이 우선 검색
전형 적 인 문 제 는 사람의 뇌 를 가장 연습 하 는 것 이 라 고 한다. 이 문 제 는 바로 깊이 우선 산법 의 정 수 를 이해 하고 유연 하 게 활용 해 야 한 다 는 것 이다. 본 문 제 는 바로 나의 지능 을 시험 하 는 문제 이다.결국 다른 사람의 코드 를 시험 하고 나 서 야 자신의 코드 를 썼 다.
//
#include
using namespace std;
#include
#include
#include
int sticks[65];
bool used[65], flag;
int n, len, piece;
bool cmp(int a, int b)
{
return a > b;
}
void dfs(int pos, int cur, int cnt)
{
if(flag)return ;//
if(cur == len){
cnt ++;
if(cnt == piece){//
flag = true;
}
dfs(0,0,cnt);
return ;
}
if(pos == n)return ;// stick
int pre = -1;
for(int i = pos; i < n; i ++){// pos
if(!used[i] && sticks[i] != pre && cur + sticks[i] <= len){
pre = sticks[i];
used[i] = true;
dfs(i + 1, sticks[i] + cur, cnt);
used[i] = false;
if(flag||pos==0)return;
}
}
}
int main()
{
// freopen("input.txt", "r+", stdin);
int i;
int sum, max;
while(scanf("%d", &n)&&n){
sum = 0;
for(i = 0; i < n; i ++){
scanf("%d", &sticks[i]);
sum += sticks[i];
}
sort(sticks, sticks+n, cmp);//
max = sticks[0];
for(i = max; i <= sum; i ++){//i sitck
if(sum%i==0){
piece = sum/i;//stick
len = i;
memset(used, false, sizeof(used));
flag = false;
dfs(0,0,0);
if(flag)break;
}
}
printf("%d
", len);
}
return 0;
}
테스트 를 통 해 일부 시스템 에 서 는 시간 을 초과 할 수도 있 고 계속 가 지 를 자 르 고 마침내 AC 2000 여 ms 가 되 었 다.
#include
using namespace std;
#include
#include
#include
int cmp(const void *a, const void *b)
{
return (*(int *)b)-(*(int *)a);
}
bool used[65];
int sticks[65];
int n, len, piece;
bool dfs(int pos, int cur, int cnt)
{
bool flag = (cur==0 ? true : false);
if(cnt == piece){
return true;
}
for(int i = pos; i < n; i ++){
if(used[i])continue;
if(cur + sticks[i] == len){
used[i] = true;
if(dfs(0,0,cnt+1))return true;
used[i] = false;
return false;
}
else if(cur + sticks[i] < len){
used[i] = true;
if(dfs(i+1, cur+sticks[i], cnt))
return true;
used[i] = false;
if(flag)return false;
while(sticks[i] == sticks[i+1])i++;
}
}
return false;
}
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int sum, i;
while(scanf("%d", &n)&&n){
sum = 0;
for(i = 0; i < n; i ++){
scanf("%d", &sticks[i]);
sum += sticks[i];
}
qsort(sticks, n, sizeof(sticks[0]), cmp);
// printf("%d
", sticks[n-1]);
memset(used, false, sizeof(used));
for(len = sticks[0]; len <= sum; len ++){
if(sum%len==0){
piece = sum/len;
if(dfs(0,0,0)){
printf("%d
", len);
break;
}
}
}
}
return 0;
}