题目链接:点击打开链接
这题颇有意思,与普通的母函数比要考虑减的情况;
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int c[100005],id[111000],v[101],cz[100005],cf[100005];
int main(){
c[0]=1;id[0]=0;
int n;
while (cin>>n){
int sum=0;
for (int i=0;i<n;i++){
cin>>v[i];
sum=sum+v[i];
}
for (int i=1;i<=sum;i++){
c[i]=0;//判断能否被得到;
cz[i]=0;//判断正数是否被访问;
cf[i]=0;//判断负数是否被访问;
}
int l=1,dl=0;//id数组存储之前可得的重量,包括负数,l是它的长度,dl是他每一次的增量;
for (int i=0;i<n;i++){
int di=v[i];
for (int k=0;k<l;k++){
if (id[k]+di>0){
if (cz[id[k]+di]==0){//保证id数组中不存在相同的数;
dl++;
id[l-1+dl]=id[k]+di;
cz[id[k]+di]=1;
}
c[id[k]+di]=1;
}
else if (id[k]+di<0){
if (cf[-id[k]-di]==0){//保证id数组中不存在相同的数;
dl++;
id[l-1+dl]=id[k]+di;
cf[-id[k]-di]=1;
}
c[-id[k]-di]=1;
}
if (id[k]-di>0){
if (cz[id[k]-di]==0){//保证id数组中不存在相同的数;
dl++;
id[l-1+dl]=id[k]-di;
cz[id[k]-di]=1;
}
c[id[k]-di]=1;
}
else if (id[k]-di<0){
if (cf[-id[k]+di]==0){//保证id数组中不存在相同的数;
dl++;
id[l-1+dl]=id[k]-di;
cf[-id[k]+di]=1;
}
c[-id[k]+di]=1;
}
}
l=l+dl;//更新id数组的长度;
dl=0;
}
int count=0;
for (int i=1;i<=sum;i++){
if (c[i]==0)count++;
}
cout<<count<<endl;
count=0;
for (int i=1;i<=sum;i++){
if (c[i]==0){
if (count)cout<<' ';
cout<<i;
count=1;
}
}
if (count)cout<<endl;
}
return 0;
}