问题描述
你有一架天平和 �N 个砝码,这 �N 个砝码重量依次是 �1,�2,⋅⋅⋅,��W1,W2,⋅⋅⋅,WN。
请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 �N。
第二行包含 �N 个整数:�1,�2,�3,⋅⋅⋅,��W1,W2,W3,⋅⋅⋅,WN。
输出格式
输出一个整数代表答案。
样例输入
3
1 4 6
样例输出
10
#include <iostream>
#include<string.h>
using namespace std;
int n = 0; //砝码的个数
const int maxn = 110;
const int maxw = 100000 + 10;
int sum = 0;
int dp[maxn][2*maxw];
int updata(int i, int j, int w)
{
if (dp[i][j] == 1)
return dp[i][j];
if (i == 0 && j != 0)
return 0;
else
{
if (updata(i - 1, j, w) || updata(i - 1, abs(j - w), w) || updata(i - 1, j + w, w))
return 1;
}
}
int main()
{
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
cin >> n;
for (int i = 1; i <= n; i++)
{
int w;
cin >> w;
sum += w;
//更新
for (int j = 0; j <= sum; j++)
if (dp[i - 1][j] || dp[i - 1][abs(j - w)] || dp[i - 1][j + w])
dp[i][j] = 1;
}
int ans = 0;
for (int i = 1; i <= sum; i++)
ans += dp[n][i];
cout << ans << endl;
return 0;
}