50分求助

P1651 塔

这个才是50 ``` #include<bits/stdc++.h> using namespace std; int n,a[55],f[500005],g[500005],maxn; int main(){ ios::sync_with_stdio(false);memset(f,-1,sizeof(f)),memset(g,-1,sizeof(g)),f[0]=g[0]=0; cin>>n;for(int i=1;i<=n;i++){cin>>a[i]; for(int j=0;j<=maxn;j++){ f[j+a[i]]=max(g[j+a[i]],g[j]); if(a[i]>=j&&g[j]!=-1)f[a[i]-j]=max(g[a[i]-j],g[j]+j); else if(g[j]!=-1)f[j-a[i]]=max(g[j-a[i]],g[j]+a[i]); }maxn+=a[i]; for(int j=0;j<=maxn;j++)g[j]=f[j]; } cout<<(f[0]==0?-1:f[0]); return 0; } ```
by 沉鸣cmh @ 2022-05-11 22:51:15


直接贴代码~~AC~~ ~~无注解~~ ``` #include<bits/stdc++.h> using namespace std; int n,a[51],din=0; int dp[51][555555]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; din=din+a[i]; } memset(dp,-0x7f7f7f,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=n;i++) { for(int j=0;j<=din;j++) { dp[i][j]=max(dp[i-1][j],dp[i-1][j+a[i]]); if(j>=a[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]); else dp[i][j]=max(dp[i][j],dp[i-1][a[i]-j]+j); } } if(dp[n][0]) cout<<dp[n][0]<<endl; else cout<<"-1"<<endl; } ```
by Msc20120507 @ 2023-01-31 18:10:13


|