#include<bits/stdc++.h>
using namespace std;
int dp[250][80050];
int main(){
int n;
cin>>n;
memset(dp,0x3f,sizeof(dp));//初始值赋inf
dp[0][40000]=0;//开始和为0,操作数为0
for(int i=1;i<=n;i++){
int x;
cin>>x;
for(int j=0;j<=80000;j++){
if(j-x>=0&&j-x<=80000)dp[i][j]=min(dp[i][j],dp[i-1][j-x]);
if(j+x>=0&&j+x<=80000)dp[i][j]=min(dp[i][j],dp[i-1][j+x]+1);
}
}
if(dp[n][40000]<n)cout<<dp[n][40000];//如果不为初始值,说明可能
else cout<<-1;//否则不可能
}
dp(01背包变形)
于 2024-03-09 18:35:58 首次发布