DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Number Partition

返回题目

题解

[1,n][1,n][1,n]의 수들을 세 더미로 나누는 문제를 조금 더 일반화하여, [1,m][1,m][1,m]의 수들을 합이 s1,s2,s3s_1,s_2,s_3s1​,s2​,s3​인 세 더미로 나눌 수 있는지 생각하자. 여기서 sis_isi​는 000일 수도 있다.

m≥3m \geq 3m≥3일 때 불가능한 경우는 다음 두 가지뿐이다.

  • si=1s_i=1si​=1인 더미가 두 개 이상인 경우.
  • si=2s_i=2si​=2인 더미가 두 개 이상인 경우.

합이 111인 더미는 반드시 {1}\{1\}{1}이어야 하고, 합이 222인 더미는 반드시 {2}\{2\}{2}이어야 하므로 위 경우는 불가능하다.

구성은 큰 수부터 하나씩 넣는다. 현재 m,m−1,⋯ ,1m,m-1,\cdots,1m,m−1,⋯,1을 처리한다고 하자. 아직 남은 목표 합이 s1,s2,s3s_1,s_2,s_3s1​,s일 때, 을 어떤 더미 에 넣으면 남은 목표 합은 이 된다. 세 더미 중 가능한 모든 선택을 시도해 보고, 남은 에 대해 위의 가능 조건을 만족하는 선택을 고른다.

가능한 상태에서 시작하면 항상 이런 선택이 존재한다. 따라서 m=n,n−1,⋯ ,1m=n,n-1,\cdots,1m=n,n−1,⋯,1 순서로 반복하면 실제 분할을 얻을 수 있다.

초기 상태에서 이미 불가능 조건을 만족하면 NO\text{NO}NO를 출력한다. 그렇지 않으면 위 과정을 통해 얻은 세 더미를 출력한다.

Solution written by GPT5.5

2
​
,
s3​
mmm
iii
si−ms_i-msi​−m
[1,m−1][1,m-1][1,m−1]