添加链接描述
时隔一年 不看题解在模拟赛上写出来了 超兴奋哈哈哈
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
int dp[110][N];//前i个 重量为j
int arr[110];
int mp[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=1e5;j++){
if(dp[i-1][j]){
dp[i][j]=1;
dp[i][j+arr[i]]=1;
if(j>=arr[i]){
dp[i][j-arr[i]]=1;
}
if(arr[i]>=j){
dp[i][arr[i]-j]=1;
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
// cout<<i<<"\n";
for(int j=0;j<=1e5;j++){
if(mp[j]==0&&dp[i][j]){
ans++;
// cout<<j<<"\n";
mp[j]=1;
}
}
}
cout<<ans-1<<"\n";
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=2e5+9,B=M/2;
int dp[N][M];
int arr[N];
int m;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
m+=arr[i];
}
dp[0][B]=1;
for(int i=1;i<=n;i++){
for(int j=-m;j<=m;j++){
dp[i][j+B]=dp[i-1][j+B];
if(j-arr[i]>=-m)dp[i][j+B]|=dp[i-1][j-arr[i]+B];//放到左边
if(arr[i]+j<=m)dp[i][j+B]|=dp[i-1][j+arr[i]+B];//放到右边
}
}
int ans=0;
for(int i=1;i<=m;i++){
if(dp[n][i+B])ans++;
}
cout<<ans<<"\n";
return 0;
}