题目描述:
夏日炎炎,小男孩 Tony 想买一些雪糕消消暑。
商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格。Tony 一共有 coins 现金可以用于消费,他想要买尽可能多的雪糕。
给你价格数组 costs 和现金量 coins ,请你计算并返回 Tony 用 coins 现金能够买到的雪糕的 最大数量 。
注意:Tony 可以按任意顺序购买雪糕。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-ice-cream-bars
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题分析:
看到题目就想到了01背包问题,然后也没多想,直接撸,结果居然超时了。
class Solution {
public:
int maxIceCream(vector<int>& costs, int coins) {
vector<int> dp(coins+1);
for(int i=0; i<costs.size(); ++i){
for(int j=coins; j>=costs[i]; --j){
dp[j]=max(dp[j], dp[j-costs[i]]+1);
}
}
return dp[coins];
}
};
优化:
最后看题解才发现直接排序+贪心即可
class Solution {
public:
int maxIceCream(vector<int>& costs, int coins) {
sort(costs.begin(), costs.end());
int costSum=0;
int ans=0;
for(int cost : costs){
if(costSum+cost < coins){
ans++;
costSum+=cost;
}
else
break;
}
return ans;
}
};
该博客介绍了如何通过优化算法解决一个实际问题,即在有限的现金下购买最多数量的雪糕。最初的方法是使用01背包问题的动态规划,但导致超时。后来通过将雪糕价格排序并采取贪心策略,即每次都选择最便宜的雪糕购买,直到现金用完,大大提高了效率,实现了有效解题。
530

被折叠的 条评论
为什么被折叠?



