1、小Q找零问题
1.1 题目描述
小Q去商场购物,经常会遇到找零的问题。小Q现在手上有 n 种不同面值的硬币,每种面值的硬币都有无限多个。为了方便购物,小Q希望带尽量少的硬币,并且要能组合出 1~m 之间(包含1和m)的所有面值。
1.2 输入描述
第一行包含两个整数 m,n(1<=n<=100,1<=m<=109),含义如题目所述,接下来的n行,每行一个整数,第 i+1 行的整数表示第 i 种硬币的面值。
1.3 输出描述
输出一个整数,表示最少需要携带的硬币数量。如果无解,则输出-1。
1.4 分析
拿到题目后,很容易的就想到了贪心算法,每次拿当前最大值的硬币去凑当前面值,记录使用硬币个数,如果当前面值没凑完,拿次小的硬币再去凑,开始写程序,才发现比较难写,时间复杂度也比较高,然后就想到了用硬币去凑,从最小的开始,每次拿到的硬币值就可以去构成1~当前可以构成的最大钱 + 硬币的值,直到这个值达到所需要的钱数。
1.5 代码实现(C++)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int TotalMoney, n, temp;
vector<int> Coin;
cin >> TotalMoney >> n;
for (int i = 0; i < n; i++) {
cin >> temp;
Coin.push_back(temp);
}
sort(Coin.begin(), Coin.end());
int CoinNumber = 0;
int CurrentMoney = 0;
while (true) {
if (CurrentMoney >= TotalMoney) {