PAT甲级1068 Find More Coins (30分)(简单解法:贪心+哈希表+堆栈)

PAT甲级1068 Find More Coins (30分)(贪心+哈希表+堆栈)

题目描述

在这里插入图片描述

样例

Sample Input 1:
8 9
5 9 8 7 2 3 4 1
Sample Output 1:
1 3 5
Sample Input 2:
4 8
7 2 4 3
Sample Output 2:
No Solution

解题思路

1、由于要输出尽可能小的序列(如果序列存在),所以使用贪心的思路每步尽可能多的选取小面值硬币。
2、题目中说明需支付的金额不超过100, 因此只需利用哈希表统计面额不超过100的硬币个数。
3、堆栈保存已选择的硬币,按照题目要求设计入栈和出栈策略。

AC代码

#include <iostream>
#include <cstdio>
#include <stack>

using namespace std;
int coins[101];
int result[101];
int index = 0;

int main()
{
	int n, pay, tem, sum = 0;
	stack<int> sstack;
	cin >> n >> pay;
	for (int i = 0; i < n; i++)
	{
		cin >> tem;
		if (tem <= 100)
			coins[tem]++;
	}
	for (int i = 1; i <= pay; i++)
	{
		if (coins[i] == 0)
			continue;
		if ((pay - sum) % i == 0 && coins[i] >= (pay - sum) / i)
		{
			for (int j = 0; j < pay / i; j++)
				sstack.push(i);
			sum = pay;
			break;
		}
		else
		{
			for (int j = 0; pay - sum - i > i && j < coins[i]; j++)
			{
				sum += i;
				sstack.push(i);
			}
			if (pay - sum - i <= i)
			{
				if (coins[pay - sum] > 0)
				{
					sstack.push(pay - sum);
					sum = pay;
					break;
				}
				else
				{
					if (sstack.empty())
						break;
					i = sstack.top();
					sum -= i;
					sstack.pop();
				}
			}
		}
	}

	if (sum == pay)
	{
		while (!sstack.empty())
		{
			result[index++] = sstack.top();
			sstack.pop();
		}
		for (int i = index - 1; i >= 0; i--)
		{
			printf("%d", result[i]);
			if (i > 0)
				printf(" ");
		}
	}
	else
		printf("No Solution");

	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值