[낙 곡] P1120 작은 나무 막대기 [데이터 강화 판]
이 문 제 는 데 이 터 를 강화 하기 때문에 블 로그 의 이전 문 제 는 이 문제 의 시간 복잡 도 를 만족 시 키 지 못 한다. 물론 폭력 을 사용 하지만 가 지 를 많이 잘라 야 한다.
// P1120
#include
#include
#include
int n,cnt,sum,maxx,t,m;
int a[100],p[110];
bool b[100];
using namespace std;
int cmp(const int&a,const int&b) {
return a>b;
}
void dfs(int l,int s,int last) {
if(s==m) {//
s=0;//
l++;// +1
last=1;//
}
if(l==t-1) {// 3
printf("%d
",m);exit(0);
}
for(int i=last; i<=cnt; i++) {// 4
if(s+a[i]>m||b[i]) continue;// [ 5]
if(a[i]==a[i-1]&&!b[i-1]) continue;// 6
if(s+p[i]return;// 7 [ !]
b[i]=1;
dfs(l,s+a[i],i+1);
b[i]=0;//
if(s==0)return;// 8
if(s+a[i]==m)return;// 9
}
}
void init() {
int x;
for(int i=1; i<=n; i++) {
scanf("%d",&x);
if(x<=50) {
a[++cnt]=x;//
sum+=x;//
maxx=max(maxx,x);//
}
}
}
int main() {
int i,j,k;
scanf("%d",&n);
init();// , 50 !
sort(a+1,a+n+1,cmp);// 1
for(i=n;i>=1;i--)
p[i]=p[i+1]+a[i];// ,
for(i=maxx; i<=sum/2; i++) {// 2
if(sum%i==0) {// ,
t=sum/i;//
m=i;//
dfs(0,0,0);//
}
}
printf("%d
",sum);// , ,
return 0;
}
이 문 제 는 가지치기 연습 을 하 는 학생 들 에 게 적합 합 니 다. 확실히 좀 복잡 하지만 저 보다 더 빠 른 [2 점 답] 이 있 을 것 입 니 다. 여러분 이 써 주 셨 으 면 좋 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LeetCode - 503. 다음 더 큰 요소 II (Next Greater Element II) [중간] - 분석 및 코드 (Java)순환 배열 (마지막 요소 의 다음 요 소 는 배열 의 첫 번 째 요소) 을 지정 하고 모든 요소 의 다음 요 소 를 출력 합 니 다.숫자 x 의 다음 더 큰 요 소 는 배열 에 따라 순 서 를 옮 겨 다 니 는 것 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.