uva307 dfs
내가 시작한 사고방식은 몇 개의 작은 나무 방망이를 일일이 열거한 후에 전체적인 근수를 나누면 작은 나무 방망이의 길이를 얻을 수 있다. 그리고 하나하나 판단한 결과 아무리 써도 쓸 줄 모른다고 쓰여 있어서 인터넷에서 대신들의 코드를 참고했다.사고방식: 직접 매거 길이를 구한 다음에 귀속을 통해 근수를 구한 다음에 곱한 후에 총 길이와 같을 수 있는지 판단하면 된다. 여기서 주의해야 할 것은 매거의 길이는 반드시 나무 막대기의 최대 길이보다 크고 총 길이보다 작아야 한다는 것이다.인터넷의 대신들은 모두 가지치기를 사용한 것 같지만, 나는 가지치기를 하든 안 하든 똑같다고 생각한다(자신이 너무 약해서 구별이 안 될 수도 있다) 그래서 가지치기를 하지 않았다.더 이상 말하지 말고 코드를 입력하십시오.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxed=100+10;
int panDuan[maxed],n,muBang[maxed],changDu,zong;
int main()
{
bool slove(int,int,int);
bool cmp(int,int);
while(scanf("%d",&n)!=EOF&&n){
//memset(panDuan,0,sizeof(panDuan));
memset(muBang,0,sizeof(muBang));
int t;
zong=0;
for(int i=0;i<n;i++){
scanf("%d",&t);
muBang[i]=t;
zong+=t;
}
sort(muBang,muBang+n,cmp);// , , 。
for(changDu=muBang[0];changDu<=zong;changDu++)
if(!(zong%changDu)){
//cout<<2<<endl;
memset(panDuan,0,sizeof(panDuan));
if(slove(0,0,0))
break;
}
printf("%d
",changDu);
}
return 0;
}
bool cmp(int x,int y)
{
return x>y;
}
bool slove(int now,int geShu,int cur)//now ,geShu ,cur ( , 0 )
{
//cout<<1<<endl;
if(geShu*changDu==zong)
return true;
for(int i=cur;i<n;i++){
if(panDuan[i])
continue;
// if(i&&!panDuan[i-1]&&muBang[i]==muBang[i-1])
// continue;
if(now+muBang[i]==changDu){
panDuan[i]=1;
if(slove(0,geShu+1,0))
return true;
panDuan[i]=0;
return false;
}
else if(now+muBang[i]<changDu){
panDuan[i]=1;
if(slove(now+muBang[i],geShu,i+1))
return true;
panDuan[i]=0;
if(now==0)
return false;
}
}
return false;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ] 5568 카드 놓기아이디어 Level이 0일 때, 즉 아직 카드를 고르지 않았을 때 StringBuilder를 생성하고 sb에 고른 카드를 담도록 하였다. 이후 해당 노드 탐색을 종료하면 sb에 담은 카드를 삭제해 주었다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.