50分代码求指错

P1651 塔

@sxd666888救我
by 赵灵儿 @ 2018-03-26 19:53:18


@ sxd666888
by 赵灵儿 @ 2018-03-26 19:53:35


@[无比自信](/space/show?uid=90659)
by 赵灵儿 @ 2018-03-26 19:53:58


@[sxd666888](/space/show?uid=84156)
by 赵灵儿 @ 2018-03-26 19:54:23


已过但不知道为什么 ```cpp #include <bits/stdc++.h> using namespace std; int n, a[55], f[55][500005], top; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); top += a[i]; } sort (a + 1, a + n +1); memset( f, -3, sizeof f); f[0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = top; j >= 0; j--) { f[i][j] = max (f[i][j], f[i-1][j]); f[i][j] = max (f[i][j], f[i-1][j + a[i]]); if (a[i] > j) { f[i][j] = max (f[i][j], f[i-1][a[i] - j] + j); } if (a[i] <= j) { f[i][j] = max (f[i][j], f[i-1][j - a[i]] + a[i]); } } } if(f[n][0] <= 0) { printf("%d\n", -1); } else { printf("%d\n", f[n][0]); } return 0; } ```
by 赵灵儿 @ 2018-03-26 19:58:00


# 如果有的差距你根本取不到,就会不满足,最高塔的高度至少要比差距大吧 ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int f[51][500001],n,a[51],sum=0; int main() { freopen("tower.in","r",stdin); freopen("tower.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } f[0][0]=0; for(int i=1;i<=n;i++)//处理了前n个 { for(int j=0;j<=250000;j++) { f[i][j]=f[i-1][j]; if(f[i-1][j+a[i]]>=j+a[i]) { f[i][j]=max(f[i][j],f[i-1][j+a[i]]); } if(a[i]<=j) { if(f[i-1][j-a[i]]>=j-a[i]) { f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]); } } else { if(f[i-1][a[i]-j]>=a[i]-j) { f[i][j]=max(f[i][j],f[i-1][a[i]-j]+j); } } } } if(f[n][0]) { cout<<f[n][0]; }else { cout<<"-1"; } return 0; } ```
by 闫灿宇123 @ 2020-11-17 21:39:58


|