Description
Yaoge在玩游戏的时候遇到了一个问题,他现在需要升级,但是又不想浪费现有的能量点,因为升级之后能量点会回满,当前没用掉的就浪费了。
已知现在剩余的能量点数 E,并且现在需要大于等于 M 点经验值才能升级。
现在有 N 个关卡,每个关卡可以打多次,这些关卡分别需要使用 Ai 点能量点打一次,能够获得 Bi 经验值,
同时关卡中可能出现稀有掉落,为了简化问题,按照稀有程度与掉落概率给每个关卡计算一个 Ci 作为通关一次获得的价值。
现在Yaoge想知道,在能量点足够使用,并且能够升级的前提下,能够最多获得多少价值?
(注意:如果通关一个关卡之后,获得经验值超过或等于升级所需经验值,就会立即升级)
Input
第一行有一个整数T,表示数据组数。(T <= 20)
之后有T组数据,每组数据第一行有三个整数N,M,E,分别表示关卡个数、升级还需要的经验值、剩余能量点数。(1 <= N, M, E <= 100)
接下来有N行,每行有三个整数Ai, Bi, Ci,分别表示关卡需要的能量点,获得的经验值、关卡价值。
(1 <= Ai, Bi, Ci <= 100)
Output
对于每组数据,在一行中输出一个整数,表示在升级的前提下最大获得的价值。
如果无论怎么样都不能升级,输出一行"Sad Yaoge!"
Sample Input
4
1 10 10
1 1 5
1 10 10
1 2 5
1 10 10
2 1 5
3 8 6
3 1 100
2 6 10
1 8 1
1 10 10
1 1 5
1 10 10
1 2 5
1 10 10
2 1 5
3 8 6
3 1 100
2 6 10
1 8 1
Sample Output
50
25
Sad Yaoge!
111
排序+边界处理!
25
Sad Yaoge!
111
排序+边界处理!
#include<iostream>
#include<algorithm>
#include<cstring>
const int INF=0x3f3f3f3f;
using namespace std;
struct guanka
{
int A,B,C;
};
bool cmp(guanka S1,guanka S2)
{
return S1.B<S2.B;
}
int main(void)
{
int i,j,k,t,n,m,e,dp[505][505];
guanka GK[505];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&e);
memset(dp,-INF,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d%d%d",&GK[i].A,&GK[i].B,&GK[i].C);
sort(GK+1,GK+1+n,cmp);
dp[0][0]=0;
for(k=1;k<=n;k++)
for(i=0;i<m;i++)
{
for(j=0;j<e;j++)
{
dp[min(i+GK[k].B,m)][min(j+GK[k].A,e+1)]=max(dp[min(i+GK[k].B,m)][min(j+GK[k].A,e+1)],dp[i][j]+GK[k].C);
}
}
int ans=-INF;
for(i=0;i<=e;i++)
ans=max(ans,dp[m][i]);
if(ans<0)
printf("Sad Yaoge!\n");
else
printf("%d\n",ans);
}
return 0;
}