算法 拿硬幣

桌上有 n 堆硬幣,每堆的數量保存在數組 arr 中。咱們每次能夠選擇任意一堆,拿走其中的一枚或者兩枚,求拿完全部硬幣的最少次數。web

示例 1:算法

輸入:[4,2,1]數組

輸出:4svg

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

示例 2:spa

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

算法一:xml

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;
}

算法二:token

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

測試測試用例:string

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;
}