P1658 購物 貪心

2022-05-01 15:33:13 字數 940 閱讀 1047

你就要去購物了,現在你手上有n種不同面值的硬幣,每種硬幣有無限多個。為了方便購物,你希望帶盡量少的硬幣,但要能組合出1到x之間的任意值。

輸入格式:

第一行兩個數x、n,以下n個數,表示每種硬幣的面值。

【資料規模】

對於30%的資料,滿足n≤3,x≤20;

對於100%的資料,滿足n≤10,x≤1000.

輸出格式:

最少需要攜帶的硬幣個數,如果無解輸出-1.

輸入樣例#1: 複製

20 4

1 2 5 10

輸出樣例#1: 複製

5

將面值從小到大排序

考慮用前ii種面值可以湊出的最大價值

顯然當且僅當a_1\neq 1a1​≠1時是無解的,因為湊不出11

這樣就限定了a_1=1a1​=1

假設已經湊出了11~ss的面值,那麼我們可以加入一張面值不超過s+1s+1的硬幣

如果超過s+1s+1,那麼就不可以湊出s+1s+1面值

設這個面值是aa,那麼可以把ss延伸到s+as+a

顯然這個面值越大越好

所以就直接找出a\leq s+1a≤s+1的最大的aa,然後把ss更新為s+as+a,同時ans++ans++即可

#include#include

#include

#include

#include

using

namespace

std;

int n,x,a[2000

],ans;

intgetin()

intmain()

int sum=0

;

while(sum

cout

}

view code

洛谷 P1658 購物 貪心

為了湊出 1 x 的所有硬幣 假設當前已經湊出了1 m 的所有面值的硬幣,那麼為了湊出更大面值的硬幣,應該如何選擇呢?有這些情況 1 選面值 t 屬於 1 m 的硬幣 這當然可以,但是想一想,有沒有更好的選擇呢?我們選擇乙個面值為 t 的硬幣,那麼,我們下一次能夠湊出的面值為 1 m t 為了符合題...

洛谷 1658 購物

洛谷 1658 購物 你就要去購物了,現在你手上有n種不同面值的硬幣,每種硬幣有無限多個。為了方便購物,你希望帶盡量少的硬幣,但要能組合出1到x之間的任意值。輸入格式 第一行兩個數x n,以下n個數,表示每種硬幣的面值。資料規模 對於30 的資料,滿足n 3,x 20 對於100 的資料,滿足n 1...

2017紀中11 8 購物 貪心 優先佇列

題面 這題有點像samjia2000出的三元組。考慮把物品按qi從小到大排序,那麼一定有乙個分界點,使得在這個點之前的物品要麼買pi要麼買qi,這個點之後的物品要麼買pi,要麼不買 可以想象一下如果之前有乙個x不買,之後有乙個買qy,買qx不買y一定更優 於是設s i 為使用至多k張優惠券買下1 i...