為了湊出 1 - x 的所有硬幣:
假設當前已經湊出了1 ~ m 的所有面值的硬幣,那麼為了湊出更大面值的硬幣,應該如何選擇呢?
有這些情況:
<1> 選面值 t 屬於 1~m 的硬幣:
這當然可以,但是想一想,有沒有更好的選擇呢?
我們選擇乙個面值為 t 的硬幣,那麼,我們下一次能夠湊出的面值為 1 ~ m + t
為了符合題意、湊出所有1 ~ x 的硬幣,我們當然希望這個 m + t 越大越好!
那麼,就要求我們這一次選擇的 t 越大越好。
因此: 我們可能需要再 1 ~ m中選乙個價值最大的硬幣。
<2> 選面值 t 屬於 m+1 ~ ? 的硬幣:
假設選擇面值是 t + 1的,這符合題意嗎?
想一想: 原本湊出了1~m,這一次得到了m+1,那麼我們就得到了從 1 ~ 2m + 1的所有面值的硬幣。這說明選1 + m是可以的
那麼,還能繼續變大嗎?
比如 選 m+2 ?
顯然不行,如果選擇了m+2,那麼我們就沒有辦法湊出面值為 m + 1的硬幣了(想一想,原本湊出的是1~m的硬幣,這一次選了個m+2的硬幣,那麼我們能湊出的
硬幣的區間實際上是不連續的 ,它是 [1 , m] u [m+2,2m+2] ,漏掉了 m+1 。 )
因此,可以確定貪心的方法: 每一次從所有面值中選擇乙個面值 t 屬於 [1,m+1] 的、且最大面值的硬幣。
就可以得到最優解
1 #include 2 #include 3using
namespace
std;
4int arr[20];5
intmain()
11 sort(arr,arr+n);
1213
int m = 0;14
int cnt = 0;15
while(m 23}
24if(cnt == 0 && x != 0
)25 cout<<"-1"
;26else cout<27return0;
28 }
P1658 購物 貪心
你就要去購物了,現在你手上有n種不同面值的硬幣,每種硬幣有無限多個。為了方便購物,你希望帶盡量少的硬幣,但要能組合出1到x之間的任意值。輸入格式 第一行兩個數x n,以下n個數,表示每種硬幣的面值。資料規模 對於30 的資料,滿足n 3,x 20 對於100 的資料,滿足n 10,x 1000.輸出...
洛谷 1658 購物
洛谷 1658 購物 你就要去購物了,現在你手上有n種不同面值的硬幣,每種硬幣有無限多個。為了方便購物,你希望帶盡量少的硬幣,但要能組合出1到x之間的任意值。輸入格式 第一行兩個數x n,以下n個數,表示每種硬幣的面值。資料規模 對於30 的資料,滿足n 3,x 20 對於100 的資料,滿足n 1...
洛谷 P1233 貪心
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...