HDU 1709 The Balance
题解:因为天平两边都可以放砝码,所以需要再建一个负的砝码值,然后用母函数即可……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <cstdio> #include <iostream> using namespace std; int c1[10005],c2[10005],n,sum,res,weight[105]; int main(){ while ( scanf ( "%d" ,&n)!=EOF){ res=sum=0; for ( int i=0;i<n;i++){ scanf ( "%d" ,&weight[i]); sum+=weight[i]; weight[n+i]=-weight[i]; } memset (c1,0, sizeof (c1)); memset (c2,0, sizeof (c2)); for ( int i=0;i<=weight[0];i+=weight[0])c1[i]=1; for ( int i=1;i<2*n;i++){ for ( int j=0;j<10005;j++){ if (i<=n-1){ for ( int k=0;k<=weight[i];k+=weight[i])c2[j+k]+=c1[j]; } else { for ( int k=weight[i];k<=0;k+=-weight[i]){ if (j+k>=0)c2[j+k]+=c1[j]; } } } for ( int j=0;j<10005;j++)c1[j]=c2[j],c2[j]=0; } for ( int i=0;i<=sum;i++) if (c1[i]==0)res++; bool flag= false ; printf ( "%d\n" ,res); if (res!=0){ for ( int i=0;i<=sum;i++){ if (c1[i]==0&&flag== false ){ printf ( "%d" ,i); flag= true ; } else if (c1[i]==0&&flag) printf ( " %d" ,i); } printf ( "\n" ); } } return 0; } |
愿你出走半生,归来仍是少年
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步