分析:
你对每个砝码都有3种选择,一种是不选,一种是放左边,取‘+’号,一种是放右边,取‘-’号
i 的范围是[1,N], j 的范围是[-V,+V] (V是所有砝码的总重量)
因为下标不能是负数,所以我们要给 j 加个偏移量V,这样 j 的范围就变成了[0,2V]
代码:
#include<iostream>
using namespace std;
const int MAX_N = 110;
const int MAX_V = 1e5+10;
int w[MAX_N];
int N;
int V;
bool dp[MAX_N][MAX_V*2];
int main(){
cin >> N;
for(int i = 1;i <= N;i++){
cin >> w[i];
V += w[i];
}
dp[0][V] = true;
for(int i = 1;i <= N;i++){
for(int j = -V;j <= V;j++){
dp[i][j+V] = dp[i-1][j+V];
if(j-w[i] >= -V){
dp[i][j+V] |= dp[i-1][j-w[i]+V];
}
if(j+w[i] <= V){
dp[i][j+V] |= dp[i-1][j+w[i]+V];
}
}
}
int ans = 0;
for(int i = 1;i <= V;i++){//统计总重量>0的集合的个数
if(dp[N][i+V]){
ans++;
}
}
cout << ans;
return 0;
}