题目链接:https://www.luogu.com.cn/problem/P8742
dp背包问题
如果 j==w[i],说明可以正好一个砝码 dp[i][j]=1。
如果 dp[i-1][j]==1,说明可以不变砝码 dp[i][j]=1。
如果 dp[i-1][j+w[i]]==1,说明可以加一个砝码 dp[i][j]=1。
如果 dp[i-1][abs(j-w[i])]==1,说明可以减一个砝码 dp[i][j]=1。
要注意数组的范围
// dp练习
#include <iostream>
#define ll long long
const ll N = 200;
ll v[N],w[N];
ll op[N];
ll dp[N][100000];
void solve(){
ll n;
std::cin >> n;
ll sum = 0;
for(ll i = 1; i <= n; i ++){
std::cin >> op[i];
sum += op[i];
}
for(ll i = 1; i <= n; i ++){
for(ll j = sum; j >= 0; j --){
if(j == op[i]) dp[i][j] = 1;
else if(dp[i - 1][j]) dp[i][j] = 1;
else if(dp[i - 1][j + op[i]]) dp[i][j] = 1;
else if(dp[i - 1][std::abs(j - op[i])]) dp[i][j] = 1;
}
}
ll ans = 0;
for(ll i = 1; i <= sum; i ++) if(dp[n][i]) ans ++;
std::cout << ans << "\n";
}
int main(){
ll t = 1;
while(t --)
solve();
return 0;
}