小米编程题:一定数目的钱,钱花完买到的最少的商品数量

一个简单的思路:因为要把钱花完,买到最少数量的商品,那就从最贵的开始买。
1,先把商品价格排序,然后从end()往begin()循环;
2,每轮循环时,先把最高单价,用muchprice保存,再判断余数为0?为0就把商存到表示数量的num数组中,更新总数量res,并且break跳出循环,返回res,不为0就把商存到num数组中,更新res,余数就是还剩余的钱,判断余数是否比最小的单价还小,小的话就是钱没花完,且剩余的钱已经买不了任何商品了,就返回-1;
3,否则进行再次循环,判断剩余的钱是否比本轮循环的最高单价小,如果小的话,肯定是不能买到这个单价的商品的,那就直接continue,跳过本次循环,进行到下一轮循环的最高单价。
思路感觉比较简单。为什么只能通过一部分;是有遗漏的地方吗?
int solution(vector < int > prices, int budget) {
	int res = 0;
	int len = prices.size();
	int muchprice = 0;
	vector<int> num(len,0);
	sort(prices.begin(),prices.end());
	if (budget <= 0) {
		return -1;
	}

	for (int i = len-1; i >= 0; i--) {
		muchprice = prices[i];
		if (budget<muchprice) {
			continue;
		}
		if (0 == (budget % muchprice)) {
			num[i] = (budget / muchprice);
			res = res+num[i];
			break;
		}else {
			num[i]=(budget / muchprice);
			res = res + num[i];
			budget = budget%muchprice;
			if (budget<prices[0]) {
				return -1;
			}
		}
	}
	return res;
}

#笔试题目##小米##题解#
全部评论
因为首要目标是花光钱,例如单价是3 5,给你9块钱,你输出-1,事实上是3件商品
点赞 回复 分享
发布于 2019-09-06 23:17
这种思路有缺陷,比如6块钱,价格是1,3,4。按贵的买起需要3,实际只需2就可以了。这种思路只能通过57,我后来用了动态规划的思路,但是也只能通过86
点赞 回复 分享
发布于 2019-09-06 23:53
一样的思路,只通过47%。。。
点赞 回复 分享
发布于 2019-09-06 23:16
同求  看来这个解法有点问题。我也是40几
点赞 回复 分享
发布于 2019-09-06 23:19
正解应该是背包吧…比如有11元,商品是5元3元,买2个5元的剩下1块钱…买1个5元2个3元正好花完
点赞 回复 分享
发布于 2019-09-06 23:25
leetcode原题,硬币那个
点赞 回复 分享
发布于 2019-09-06 23:28
因为会有重复购买同一种商品的可能,我特意看了,题里说每个商品货存充足
点赞 回复 分享
发布于 2019-09-06 23:36
用动态规划,就是硬币问题
点赞 回复 分享
发布于 2019-09-06 23:38
这是硬币找零问题,leetcode上有
点赞 回复 分享
发布于 2019-09-06 23:40
钱要花完,你这样钱没花完。
点赞 回复 分享
发布于 2019-09-06 23:50
贪心不行就换dp
点赞 回复 分享
发布于 2019-09-07 00:08
最小背包
点赞 回复 分享
发布于 2019-09-07 00:12
完全背包问题
点赞 回复 分享
发布于 2019-09-07 01:46
我七十多通过率,
点赞 回复 分享
发布于 2019-09-07 15:43
完全背包
点赞 回复 分享
发布于 2019-09-07 15:44
比如你有1000元,现在商品是300 250 50,如果按照你的取法就是300 300 300 50 50,总数是5,而取 250 250 250 250,总数是4,
点赞 回复 分享
发布于 2019-09-07 16:04
完全背包经典题 凭感觉敲出来的。。。搞得晕晕的😂
点赞 回复 分享
发布于 2019-09-07 16:24

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
评论
点赞
22
分享
牛客网
牛客企业服务