SSLOJ 1333 天平问题
Description–
小C为了试验小X,便为物竞的小X出了一道物理相关的题:现在给出n个质量的砝码,问小X能称出多少种质量的物品,可是总有好事者想要破坏,于是乎,n达到了500,远远超出了小X能够承受的范围,锲而不舍的他决定寻求你们的帮助。
Input–
第一行输入一个的正整数N
以下N行每行一个不超过200的正整数,依次表示每个砝码的质量。
Output–
输出总共能称出多少种不同质量的物品。
Sample Input–
3
1
3
9
Sample Output–
13
说明–
注意:天平有两边,两边均可放。
代码–
#include<iostream>
#include<cstdio>
using namespace std;
bool f[505][40005];
int n,a,ans;
int main()
{
scanf("%d",&n);
f[0][20000]=1; //初始化:0个砝码可以称0kg的物品
for (int i=1;i<=n;++i)
{
scanf("%d",&a);
for (int j=0;j<=40000;++j)
if (f[i-1][j])
{
f[i][j]=1;
if (j+a<40000) f[i][j+a]=1;
if (j-a>=0) f[i][j-a]=1;
}
}
for (int i=20001;i<=40000;++i)
if (f[n][i])
ans++;
printf("%d",ans);
return 0;
}