【 POJ 1014 】 다 중 가방 나 누 기, 이 진 아 이 템 나 누 기 01 가방
본 고의 최 적 화 는 이 진 최적화, O (logn) 이다. 완전 가방 기록 에 사 용 된 개수 의 O (n) 알고리즘 에 대해 본 고 는 설명 하지 않 고 블 로그 의 '가방' 분류 에 있다.
바 이 너 리 최적화:
여러분 은 한 십 진수 가 이 진수 로 바 뀔 수 있다 는 것 을 알 고 있 습 니 다. 그러면 어떤 물품 이 1023 가지, 즉 2 ^ 10 - 1, 이 진 이 111111111 이 라 고 가정 하면 모든 사람 이 (1, 2, 4, 8, 16, 32, 64, 128, 256, 512 곶 개의 물품 을 섞 어 합성 한 큰 물건 으로 볼 수 있 습 니 다. 이 진 수 는 한 사람 당 0 은 바람 직 하지 않다 고 표시 하고 1 은 바람 직 하지 않다 고 표시 합 니 다. 그러면 우 리 는 모든 수 를 다 찾 을 수 있 습 니 다.2 의 정수 멱 - 1 개의 물품 이 아니라면 부족 한 물품 의 개 수 를 보충 하면 된다. 예 를 들 어 1025 는 2 개의 물품 으로 구 성 된 새로운 물품 을 보충 하면 된다.
코드:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n[7],sum;
bool f[121000];
int main()
{
// freopen("test.in","r",stdin);
int i,j,k,g;
int flag;
for(g=1;;g++)
{
flag=sum=0;
for(i=1;i<=6;i++)
{
scanf("%d",&n[i]);
if(n[i])flag=1,sum+=n[i]*i;
}
if(!flag)return 0;
printf("Collection #%d:
",g);
if(sum&1)
{
printf("Can't be divided.
");
continue;
}
sum>>=1;
memset(f,0,sizeof(f));
f[0]=1;
for(i=1;i<=6;i++)
{
/* */
int temp;
for(j=0;(1<<j)<n[i];j++)
{/* for (1<<j) , 。*/
n[i]-=(1<<j);
temp=(1<<j)*i;
for(k=sum-1;k>=0;k--)if(f[k]&&k+temp<=sum)f[k+temp]=1;
if(f[sum])break;
}
if(n[i])
{/* “1025” */
temp=n[i]*i;
for(k=sum-1;k>=0;k--)
if(f[k]&&k+temp<=sum)
f[k+temp]=1;
}
/**/
if(f[sum])break;
}
if(f[sum])printf("Can be divided.
");
else printf("Can't be divided.
");
}
return 0;
}
번역
번역 결과
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 4501 샤 오 밍 시리즈 이야기 - 설 맞이 다 중 가방 사기슈퍼마켓 에 도착 하 자마자 샤 오 밍 은 슈퍼마켓 입구 에 한 무리의 사람들 이 모 이 는 것 을 발견 했다.백운 여사 의 말 에 따 르 면 "그 녀석, 그 장면 은 정말 인산 인 해 를 이 루 었 다. 그것 은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.