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

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值