5
-5 7
8 -6
6 -3
2 1
-8 -5
8
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; int n,a[105],b[105],f[105][200015],suma = 100000,ans,bg = 100000,inf = 100005; int main(){ cin>>n; for(int i = 1;i <= n;i++){ scanf("%d%d",&a[i],&b[i]); if(a[i] >= 0) suma += a[i]; } for(int i = 0;i <= bg * 2;i++) f[1][i] = -inf; f[1][bg+a[1]] = b[1]; f[1][bg] = 0; for(int i = 2;i <= n;i++){ for(int j = 0;j <= bg * 2;j++){ f[i][j] = f[i-1][j]; if(j - a[i] >= 0 && j - a[i] <= bg * 2) f[i][j] = max(f[i][j],f[i-1][j-a[i]] + b[i]); if(j >= bg && f[i][j] >= 0) ans = max(ans,j + f[i][j] - bg); } } cout<<ans; return 0; }
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,f[101][200001];//前i个数sum_a[i]为j的max{sum_b[i]} int ans,maxa=100000,mina=100000; int a[1001],b[1001]; int main() { scanf("%d",&n); for(int i=0;i<=n;i++) for(int j=0;j<=200000;j++) f[i][j]=-999999; f[0][100000]=0; for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]); for(int i=1;i<=n;i++) { maxa=max(maxa,maxa+a[i]); mina=min(mina,mina+a[i]); for(int j=200000;j>=0;j--) { f[i][j]=max(f[i][j],f[i-1][j]); if(j-a[i]>=0)f[i][j]=max(f[i][j],f[i-1][j-a[i]]+b[i]); if(j>=100000&&f[i][j]>=0)ans=max(ans,j+f[i][j]-100000); } } printf("%d",ans); return 0; }
原文:http://www.cnblogs.com/hyfer/p/5754694.html