最少的硬幣組合出1到m之間的任意值(貪婪演算法)

2021-09-16 22:37:31 字數 819 閱讀 6890

首先判斷有無解,如果最小面額硬幣大於1則無解,因為搭配不出1。如果有1則有解,因為所有面額都可以由1堆積出來。 接下來思考乙個問題,假設當前硬幣可以組合出1到5的任意面額,那麼新增一枚面額為6的硬幣就可以搭配出1到11的任意面額。

考慮1 ~  i - 1已經構出,那麼再加一枚什麼面值的硬幣最優,顯然選一枚<=sum+1且面值最大的即可。面值最大保證了硬幣數最小。sum表示硬幣面值和。事實上,這個貪心可以從f[i] = f[i−a[k]] + 1看出。f[i]必然是單調增的,因此貪心即可。f[i]表示處理完1−i的最少硬幣數

於是我們依照這個思路,假設當前硬幣面值的和為sum,每一次新增硬幣時,從大到小搜尋,將搜尋到的第一枚面值小於等於sum+1的硬幣加入,並將計數器+1,更新sum值,如果sum的值大於等於m的值,則查詢結束。**如下:

#include#include#include#includeusing namespace std;

int main()

sort(coin.begin(), coin.end());

if (coin[0] != 1)

while (true)

for (int i = n - 1; i >= 0; i--)

if (coin[i] <= sum + 1)

}}

隨機生成零到n之間的m個數

隨機生成0到n之間的m個數 如何用隨機數生成0到n之間的m個不重複的數 1 最直接的方法就是先隨機生成乙個0到n之間的數,判斷這個數是否已被選上,如果以前沒選過,則選上,如果以前已選,則丟棄 void common int n,int m int randnum int malloc n sizeo...

輸出m到n之間的所有Fibonacci數

問題描述 輸入2個正整數m和n m 1,n 10000 輸出m到n之間所有的fibonacci數fibonacci數列 第一項起 1,1,2,3,5,8,13,21 輸入形式 從鍵盤輸入2個整數m和n,以空格分隔。輸出形式 輸出m到n之間所有的fibonacci 數,以空格分隔。樣例輸入1 20 1...

統計0到n之間1的個數

問題描寫敘述 給定乙個十進位制整數n,求出從1到n的全部整數 現 1 的個數。比如 n 2時 1,2出現了1個 1 n 12時 1,2,3,4,5,6,7,8,9,10,11,12。出現了5個 1 1位數的情況 在解法二中已經分析過,大於等於1的時候。有1個,小於1就沒有。2位數的情況 n 13,個...