传送门
可以证明:若我们从大往小放木板,那么任意差值都能被构造出。
#include<bits/stdc++.h>
using namespace std;
int cnt[105];
bitset<100005> a,b;
int read(){
int op=1,sum=0;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') op=-1;ch=getchar();}
while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
return op*sum;
}
int main(){
int n=read(),maxn=0;
for(int i=1;i<=n;++i){
int x=read();
++cnt[x];
maxn=max(maxn,x);
}
a[0]=1;cnt[maxn]--;
for(int i=100;i;--i){
if(!cnt[i])continue;
for(int k=1;k<=cnt[i];++k){
b=a;
for(int j=100;j>i;--j){
if(cnt[j]){
a|=(b<<(j-i));
}
}
}
}
for(int i=0;i<=100000;++i){
if(a[i])printf("%d ",i);
}
return 0;
}