HDU --- 6082 度度熊与邪恶大魔王 【完全背包】

传送门
//题意 : 中文的还是不要偷懒, 自己读吧.
//思路 : 利用完全背包. dp[i][j]代表打死防御力为i, 生命值为j的怪兽最少需要消耗的晶体数. 由于技能可以被无限多次使用, 那么这就有点类似完全背包了, 每一种物品可以放无限多次. 所以就是一道裸题了, 直接上就是了, 注意维护的一个最小, 即可以打倒高血量的晶体数那么也一定可以打倒低血量的, 所以需要更新一个最小值. 因为我们并不是一一去减的, 而是跳着减的, 所以有可能最优的被减掉了. 所以需要再次维护一下.

AC Code

/** @Cain*/
const int maxn = 1e3+10;
int n,m;
ll dp[15][maxn], k[maxn], p[maxn], a[maxn*100], b[maxn*100];

void solve()
{
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)
            scanf("%I64d%I64d",&a[i],&b[i]);
        for(int i=1;i<=m;i++)
            scanf("%I64d%I64d",&k[i],&p[i]);
        for(int i=0;i<=10;i++){
            for(int j=0;j<maxn*2;j++){
                dp[i][j] = INF;
            }
        }

        for(int i=0;i<=10;i++){
            dp[i][0] = 0;   //初始化.
            for(int j=0;j<=maxn;j++){
                for(int h=1;h<=m;h++){
                    ll tmp = p[h] - i;
                    if( tmp < 0 || j - tmp < 0) continue;
                    dp[i][j] = min(dp[i][j],dp[i][j-tmp]+k[h]);
                }
            }
            for(int j=maxn;j>=0;j--)
                dp[i][j] = min(dp[i][j],dp[i][j+1]);
        }

        ll res = 0;
        for(int i=1;i<=n;i++) res += dp[b[i]][a[i]];
        if(res > INF) printf("-1\n");
        else printf("%I64d\n",res);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值