演算法 拿硬幣

_MaL發表於2020-10-16

桌上有 n 堆硬幣,每堆的數量儲存在陣列 arr 中。我們每次可以選擇任意一堆,拿走其中的一枚或者兩枚,求拿完所有硬幣的最少次數。

示例 1:

輸入:[4,2,1]

輸出:4

解釋:第一堆硬幣幣最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,總共 4 次即可拿完。

示例 2:

輸入:[2,3,10]
int TakeCoin(vector& coin)
{
int cnt = 0;
for (auto c : coin)
{
cnt += c / 2; // 前幾次都拿兩枚硬幣
cnt += c % 2; // 不夠兩枚,拿一枚
}
return cnt;
}
輸出:8

演算法一:

int minCount(int* arr, int num)
{
	int i, count = 0;	
	for (i = 0;i < num;i++) 
	{
		if (arr[i] % 2 != 0)//不能整除  次數+1
		{
			count += (arr[i] + 1) / 2;
		}
		else {   //整除
			count += arr[i] / 2;
		}
	}
	return count;
}

演算法二:

int TakeCoin(vector<int>& coin)
{
	int cnt = 0;
	for (auto c : coin)
	{
		cnt += c / 2;		// 前幾次都拿兩枚硬幣
		cnt += c % 2;		// 不夠兩枚,拿一枚
	}
	return cnt;
}

測試測試用例:

int main()
{
	vector<int> coin1 = { 4,2,1 };
	auto ret1 = TakeCoin(coin1);

	vector<int> coin2 = { 2,3,10 };
	auto ret2 = TakeCoin(coin2);

	cout << ret1 << "  " << ret2  << endl;

	return 0;
}

相關文章