题目描述
小C为了试验小X,便为物竞的小X出了一道物理相关的题:现在给出n个质量的砝码,问小X能称出多少种质量的物品,可是总有好事者想要破坏,于是乎,n达到了500,远远超出了小X能够承受的范围,锲而不舍的他决定寻求你们的帮助。
输入
第一行输入一个的正整数N
以下N行每行一个不超过200的正整数,依次表示每个砝码的质量。
输出
输出总共能称出多少种不同质量的物品。
输入样例
3
1
3
9
输出样例
13
注意:天平有两边,两边均可放。
思路
DP
F[i][j]F[i][j]F[i][j]为前iii件有jjj中可能
因为会有负数
所以以20000为0
#include<Algorithm>
#include<Iostream>
#include<Cstring>
#include<Cstdio>
#include<Cmath>
using namespace std;
int A[525],F[525][50250];
int Ans,n;
int main()
{
scanf("%d",&n);
F[0][20000]=1;//零件重量只有0
for(int i=1;i<=n;++i)scanf("%d",&A[i]);
for(int i=1;i<=n;++i)
for(int j=0;j<=40000;++j)
if(F[i-1][j])
F[i][j+A[i]]=F[i][j-A[i]]=F[i][j]=1;//加减和不用三种可能
for(int i=20001;i<=40000;++i)//用正数
if(F[n][i])Ans++;
printf("%d",Ans);
return 0;
}