洛谷 P1658 購物 貪心

2022-06-09 06:39:07 字數 1048 閱讀 1753

為了湊出 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 3

using

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,這個棍子就不需要...