给定一个target,让用最少的硬币类别找零钱

Descrition:

给定一个目标硬币额,需要用最少的硬币数来实现找零,返回的结果为零钱的类别数,例如:给定零钱类别为[5,3,1],目标金额为11,则输出结果为2;只需要5和1即可完成找零。

**分析:**本题可以利用贪心法,每次都将目标金额和最大的零钱类别比较,如果一直大于则就使用最大的零钱来找,如果不满足则用次大的来找零,直到目标金额和当前的找零相同或者目标金额为0,则退出。

**说明:**本题在本地VS2015上运行通过。

代码如下所示:

//Descrition:
//利用最小的硬币个数实现找出目标硬币

#include
#include

using namespace std;

class Solution {
public:
	int changeofcoinsleastnum(vector& coins,int target) {
		if (coins.empty()) return 0;
		vector flag(coins.size(),false); //用于标记已经使用的零钱;
		int result = 0;
		for (int i = 0; i < coins.size(); ++i) {
			//int temp = i;
			while (target >= coins[i] && target > 0) {
				flag[i] = true;
				target -= coins[i];
				if (target == coins[i] || target == 0)
					return numoftrue(flag);
			}
		}
		return 0;
	}
	int numoftrue(vector& temp) { //统计使用零钱的类别个数
		int temp_result = 0;
		for (int i = 0; i < temp.size();i++) {
			if (temp[i])
				temp_result++;
		}
		return temp_result;
	}
};
int main(int argc,char** argv) {
	vector coins = {5,3,1};
	Solution test;
	cout<

结果如下所示:

在这里插入图片描述

你可能感兴趣的:(面试笔试试题)