题意:给你n个si和fi,要求在Ts,Tf为正数的情况下Ts+Tf的最大值。
题解:因为每一个只有两个选择取和不取,所以很容易看出是01背包,但是要注意的是它有负数的情况,所以要把整个坐标轴左移。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
int maxx = 200001;
int dp[200010],a[110],b[110];
int main(){
int n;
cin>>n;
int sum = 0;
for(int i = 0 ; i < n ; i++){
scanf("%d %d",&a[i],&b[i]);
}
for(int i = 0 ; i <= maxx ; i++){
dp[i] = -inf;
}
dp[100000] = 0;
for(int i = 0 ; i < n ; i++){
if(a[i]<0&&b[i]<0) continue;
if(a[i]>0){
for(int j = maxx - 1; j >= a[i] ; j--){
dp[j] = max(dp[j],dp[j-a[i]]+b[i]);
}
}else{
for(int j = 0 ; j < maxx + a[i] ; j++){
dp[j] = max(dp[j],dp[j-a[i]]+b[i]);
}
}
}
int ans = 0;
for(int i = 100000 ; i < maxx ; i++){
if(dp[i]>0)
ans = max(ans,dp[i]+i-100000);
}
cout<<ans<<endl;
}