The Balance
解析:1.正向:往揹包裏面放東西,求出那些經過相加之後能得到的體積。
2.逆向:從揹包裏面拿出東西,求出哪些組合相減之後能得到的體積。
代碼:
#include<cstdio>
#include<queue>
#include<cstring>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn=1e2;
const int maxsum=1e4;
int a[maxn+10];
bool f[maxsum+10];
queue<int> q;
int main()
{
freopen("1.in","r",stdin);
int n,i,j,sum;
while(scanf("%d",&n)==1)
{
for(sum=0,i=1;i<=n;i++)
scanf("%d",&a[i]),sum+=a[i];
ms(f),f[0]=1;
for(i=1;i<=n;i++)
for(j=sum;j>=a[i];j--)f[j]|=f[j-a[i]];
for(i=1;i<=n;i++)
for(j=1;j+a[i]<=sum;j++)f[j]|=f[j+a[i]];
for(j=0,i=1;i<=sum;i++)if(!f[i])q.push(i),j++;
printf("%d\n",j);
if(j==0)continue;
printf("%d",q.front()),q.pop();
while(!q.empty())printf(" %d",q.front()),q.pop();
printf("\n");
}
return 0;
}