题目大意:
给N个砝码 和一个天平 求出【1,sum】之间不能称出来的重量
思路:
可以看做是01背包 选与不选 然后比01背包多一种状态 那就是还可以相减 在此取绝对值就可以了
#include <cstdio>
#include <cstring>
using namespace std;
int vis[10005];
int x[10005];
int dp[10005];
int abs(int x)
{
return x<0?-x:x;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
int sum=0,cnt=0;
vis[0]=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
sum+=x[i];
}
for(int i=1;i<=n;i++)
{
memset(dp,0,sizeof(dp));
for(int j=0;j<=sum;j++)
{
if(vis[j])
{
dp[j+x[i]]=1;
dp[abs(j-x[i])]=1;
}
}
for(int j=0;j<=sum;j++)
if(dp[j])vis[j]=1;
}
for(int i=1;i<=sum;i++)
{
if(!vis[i])cnt++;
}
bool first=false;
printf("%d\n",cnt);
for(int i=1;i<=sum;i++)
{
if(!vis[i])
{
if(!first)
{
printf("%d",i);
first=true;
}
else printf(" %d",i);
}
}
if(cnt)puts("");
}
}