前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >天池 在线编程 卡牌游戏(01背包)

天池 在线编程 卡牌游戏(01背包)

作者头像
Michael阿明
发布2021-09-06 10:03:06
3400
发布2021-09-06 10:03:06
举报
文章被收录于专栏:Michael阿明学习之路

1. 题目

你跟你的朋友在玩一个卡牌游戏,总共有 n 张牌。 每张牌的成本为 cost[i] 并且可以对对手造成 damage[i] 的伤害。 你总共有 totalMoney 元并且需要造成至少 totalDamage 的伤害才能获胜。 每张牌只能使用一次,判断你是否可以取得胜利。

代码语言:javascript
复制
样例1
输入:
cost = [1,2,3,4,5]
damage = [1,2,3,4,5]
totalMoney = 10
totalDamage = 10

输出: true
样例说明: 我们可以使用 [1,4,5] 去造成10点伤害,总花费为10。

Example2
输入:
cost = [1,2]
damage = [3,4]
totalMoney = 10
totalDamage = 10

输出: false
样例说明:我们最多只能造成7点伤害。

2. 解题

代码语言:javascript
复制
class Solution {
public:
    /**
     * @param cost: costs of all cards
     * @param damage: damage of all cards
     * @param totalMoney: total of money
     * @param totalDamage: the damage you need to inflict
     * @return: Determine if you can win the game
     */
    bool cardGame(vector<int> &cost, vector<int> &damage, int totalMoney, int totalDamage) {
        // Write your code here
        int n = cost.size();
        unordered_map<int,int> dp;
        dp[0] = 0;
        for(int i = 0; i < n; i++) {
            unordered_map<int,int> tmp(dp.begin(), dp.end());//复制上一次的状态,这次不拿
            for(auto& d : dp) { // 遍历原有状态
                int c = d.first;
                int dg = d.second;
                if(c + cost[i] <= totalMoney)// 可以拿
                {
                    tmp[c + cost[i]] = max(tmp[c+ cost[i]], dg+damage[i]);
                    if(tmp[c + cost[i]] >= totalDamage)
                        return true;
                }
            }
            dp.swap(tmp);
        }
        return false;
    }
};

100ms C++

我的CSDN博客地址 https://michael.blog.csdn.net/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档