您的位置:首页 > 其它

开坑!SHU1964 Level Up!(二维完全背包)坑已填

2015-12-24 23:39 218 查看

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

Sample Output

50

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: