**
P1089 smrtfun
**
时间: 1000ms / 空间: 131072KiB / Java类名: Main
**
背景
**
广东汕头聿怀初中 Train#2 Problem3
**
描述
**
现有N个物品,第i个物品有两个属性A_i和B_i。在其中选取若干个物品,使得sum{A_i + B_i}最大,同时sum{A_i},sum{B_i}均非负(sum{}表示求和)。
**
输入格式
**
第一行,一个整数,表示物品个数N。
接下来N行,每行两个整数,表示A_i和B_i。
**
输出格式
**
一个整数,表示最大的sum{A_i + B_i}。
**
测试样例1
**
**
输入
**
5
-5 7
8 -6
6 -3
2 1
-8 -5
**
输出
**
8
**
备注
**
N <= 100 , |A_i| <= 1000 , |B_i| <= 1000
**
Code
**
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,f[101][200001];
int ans;
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]=-9999999;
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++)
{
for(int j=200000;j>=0;j--)
{
f[i][j]=max(f[i-1][j],f[i][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,f[i][j]-100000+j);
}
}
printf("%d",ans);
return 0;
}
——既然选择了远方,便只顾风雨兼程
欢迎各犇指正~