>Description 现在给出n个质量的砝码,问能称出多少种质量的物品。
>Input 第一行输入一个的正整数N 以下N行每行一个不超过200的正整数,依次表示每个砝码的质量。
>Output 输出总共能称出多少种不同质量的物品。
>Sample Input 3 1 3 9
>Sample Output 13
>解题思路 因为天平的两边都可以放砝码,所以把负数看为左边放砝码,正数看为右边放砝码。 所以把最大值20000看为原点。
>代码
#include
<iostream
>
#include
<cstdio
>
using namespace std
;
int n
,ans
,a
[505];
bool f
[505][40005];
int
main()
{
scanf("%d",&n
);
f
[0][20000]=1;
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
++)
ans
+=f
[n
][i
];
printf("%d",ans
);
return 0;
}