文章目录
- 1. 题目
- 2. 解题
1. 题目
你跟你的朋友在玩一个卡牌游戏,总共有 n 张牌。
每张牌的成本为 cost[i] 并且可以对对手造成 damage[i] 的伤害。
你总共有 totalMoney 元并且需要造成至少 totalDamage 的伤害才能获胜。
每张牌只能使用一次,判断你是否可以取得胜利。
样例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点伤害。
https://tianchi.aliyun.com/oj/286614371019772507/338469151696950134
2. 解题
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 hereint 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/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!