这个,RP在竞赛中的重要性就不需要多说了~ 这是一道典型的动态规划,dp[NN],用来表示 RP为 NN 时 最大收益率
因为可能为负值,故采取加一个权值使其为正数。 注意下初始化问题,然后还有 a 的正负关系的状态转移方程虽然一样,但是,循环方式不同,一个从小到大,一个从大到小,为什么需要这样, 不解释,嘿嘿!
状态转移方程:dp[i+a] = max(dp[i]+c,dp[i+a]);
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 99999999
#define NN 20010
int RP[NN];
int l,r,max, rp;
int main()
{
int T,n,a,b,c,i,x;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=0;i<NN;i++)RP[i] = -INF;
l=r= 10000;
max = 0;
RP[l]=0;
while(n--){
scanf("%d%d%d",&a,&b,&c);
b +=10000;
if(a < 0){
for(i=b;i<=r;i++)
if(RP[i] != -INF){
x = RP[i] +c;
//if(RP[i+a] == -INF)RP[i+a] = 0;
if(RP[i+a] < x)
RP[i+a] = x;
}
l +=a;
}
else if (a>0){
for(i=b;i>=l;i--){
if(RP[i] !=-INF){
x = RP[i] +c;
//if(RP[i+a] == -INF)RP[i+a] = 0;
if(RP[i+a] < x)
RP[i+a] = x;
}
}
r +=a;
}
}
for(i=l;i<=r;i++)
if(RP[i] > max &&RP[i] != -INF)max = RP[i];
printf("%d\n",max);
}
return 0;
}