題目
給你一個sum,以及擁有的錢
讓你找出一個組合,正好用兩張錢付清sum,注意如果有多個結果,輸出其中最小的
這道題注意稍微優化一下算法,要不然卡在測試點3,4
我是用二重循環過了的,只要注意輸入的時候去重一下數據,然後在計算的時候進行合理的剪枝,並不會超時。
題解 C++
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> coin;
int coins[1000] = { 0 };//用於去重
int cmp(int a1, int a2) {//小到大
return a1 < a2;
}
int main() {
int totalCoin;
int sum;
cin >> totalCoin >> sum;
//擁有的硬幣
for (int i = 0; i < totalCoin; i++) {
int t;
cin >> t;
if (coins[t] > 2) {//數據去重,否則3、4測試點超時
continue;
}
else {
coin.push_back(t);
coins[t]++;
}
}
//排序
sort(coin.begin(), coin.end(), cmp);
//求和
for (int i = 0; i < totalCoin; i++) {
for (int j = i + 1; j < totalCoin; j++) {
if (coin[i] + coin[j] == sum) {
cout << coin[i] << " " << coin[j];
return 0;
}
else if (coin[i] + coin[j] > sum) {
break;
}
}
if (coin[i] * 2 > sum) {
break;
}
}
cout << "No Solution";
system("pause");
}