地址:
点击打开链接
有趣,这个题目,我开的数组不够大,竟然给我报的是TE。
这个题目最有趣的是,两边都可以放,也就是后面的a[k-l]和a[k+l]都需要进行赋值操作
代码如下:
#include<iostream> #include<cstdio> #include<string.h> #include<cmath> #include<stdlib.h> #include<fstream> using namespace std; #define MAX 10100 int n ,w[101],a[MAX],b[MAX],res[MAX]; int main(){ int i,j,k,Num,SUM,res_num; while(~scanf("%d",&Num)) { SUM = 0 ; memset(res,0,sizeof(res)); memset(w,0,sizeof(w)); memset(a,0,sizeof(a)); for(i = 1 ; i<= Num; i ++) { scanf("%d",&w[i]); SUM+=w[i]; } a[0]=a[w[1]]=1; memset(b,0,sizeof(b)); for(i = 2 ; i <= Num ; i++) { for(j = 0; j <=SUM ; j++) { for(k = 0 ; k<=w[i]&&k+j<=SUM ; k+=w[i]) { b[j+k]+= a[j]; b[abs(j-k)]+=a[j] ; } } for(j = 0 ; j <=SUM; j++) { a[j]=b[j]; b[j]=0 ; } } res_num=0; for(i = 1 ; i <=SUM ; i++) { if(a[i]==0) { res[res_num++]=i; } } printf("%d\n",res_num); if(res_num>0) { printf("%d",res[0]); for(i = 1 ; i <res_num ; i++) { printf(" %d",res[i]); } printf("\n"); } } }