题意:给定一个天平和几个砝码,砝码左右盘都能放,求都能称出哪些重量。
分析:生成函数板子题。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1E4+10;
int main()
{
int a[N],b[N],v[205],ans[205],last,last2,cnt,n;
//不能设置全局变量,不然会T,(ง •_•)ง
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++) scanf("%d",&v[i]);
a[0]=1;last=0;
for(int i=0;i<n;i++)
{
last2=last+v[i];
memset(b,0,sizeof(int)*(last2+1));
for(int j=0;j<=last;j++)
for(int k=0;k<=1&&j+k*v[i]<=last2;k++)
{
b[j+k*v[i]]+=a[j];
b[abs(j-k*v[i])]+=a[j];
}
memcpy(a,b,sizeof(int)*(last2+1));
last=last2;
}
cnt=0;
for(int i=1;i<=last;i++)
if(!a[i])
ans[cnt]=i,cnt++;
printf("%d\n",cnt);
for(int i=0;i<cnt;i++)
{
printf("%d",ans[i]);
if(i!=cnt-1) putchar(' ');
else puts("");
}
}
return 0;
}