一、思路
定义DP数组,DP[i][j]代表TS为[i]时,TF的最大值。
二、代码
#include <iostream>
using namespace std;
int dp[2][200007], N, inf = 0x3f3f3f3f, s[107], f[107];
void input()
{
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
scanf("%d%d", &s[i], &f[i]);
}
}
void preHandle()
{
for (int i = 0; i <= 200006; i++)
{
dp[0][i] = inf;
dp[1][i] = inf;
}
dp[0][0 + 100000] = 0, dp[1][0 + 100000] = 0;
}
void solve(int i, int j)
{
if (dp[(i - 1) % 2][j] != inf)
{
int nextVal = dp[(i - 1) % 2][j] + f[i];
if (dp[i % 2][j + s[i]] == inf || dp[i % 2][j + s[i]] < nextVal)
{
dp[i % 2][j + s[i]] = nextVal;
}
if (dp[i % 2][j] == inf || dp[i % 2][j] < dp[(i - 1) % 2][j])
{
dp[i % 2][j] = dp[(i - 1) % 2][j];
}
}
}
void doDp()
{
for (int i = 1; i <= N; i++)
{
for (int j = 0; j <= 200006; j++)
{
solve(i, j);
}
}
}
int findAns()
{
int ans = 0;
for (int i = 100000; i <= 200006; i++)
{
if (dp[N % 2][i] >= 0 && dp[N % 2][i] != inf)
{
ans = max(i - 100000 + dp[N % 2][i], ans);
}
}
return ans;
}
int main()
{
input();
preHandle();
doDp();
printf("%d\n", findAns());
return 0;
}