资源限制
时间限制:1.0s 内存限制:256.0MB
#include<iostream>
#include<cmath>
using namespace std;
const int N = 110, M = 1e5 + 10;
int n, sum, w[N];
int f[N][M];//f[i][j]表示用前i个砝码是否能称量j重量,1为可,0为不能
//显然易知左物右码
//对于第i个砝码,有三种可能,即,不选,放左边,放右边。只要三者其中之一是可行,那么f[i][j]即可行
//不选 f[i][j]=f[i-1][j]
//放左边 f[i][j]=f[i-1][j+w[i]]
//放右边 f[i][j]=f[i-1][abs(j-w[i])] abs取绝对值防止下标为负数
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
sum += w[i];
}
f[0][0] = true;//显然不用砝码便能称量0重量
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= sum; j++)
{
f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])];//三种情况有一种可行即可行
}
}
int ans = 0;
for (int j = 1; j <= sum; j++)
{
if (f[n][j])ans++;//在n个砝码和的范围内,统计可行方案
}
cout << ans;
return 0;
}