HDU 1709
MB,一开始就想到是不是只要加上一个不选择砝码的情况,但一直没动手做,因为看了看网上了,觉得总有点复杂,认为自己想错了。。。。
相信自己
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 101
using namespace std;
int c1[N*N],c2[N*N];
int Fa[N],ans[N*N],ap;
int main(){
int n,sum;
while(scanf("%d",&n)!=EOF){
sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&Fa[i]);
sum+=Fa[i];
}
sort(Fa+1,Fa+n+1);
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
c1[0]=c1[Fa[1]]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<=sum;j++){
for(int k=0;k<=Fa[i];k+=Fa[i])
c2[k+j]+=c1[j],c2[abs(k-j)]+=c1[j];
}
for(int j=0;j<=sum;j++)
c1[j]=c2[j],c2[j]=0;
}
ap=0;
for(int j=1;j<=sum;j++)
if(c1[j]==0){
ans[ap++]=j;
}
printf("%d\n",ap);
if(ap) printf("%d",ans[0]);
for(int i=1;i<ap;i++)
printf(" %d",ans[i]);
if(ap) printf("\n");
}
return 0;
}

浙公网安备 33010602011771号