日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P1658 购物

發(fā)布時(shí)間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1658 购物 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1658 購(gòu)物

題目鏈接


題目描述

你就要去購(gòu)物了,現(xiàn)在你手上有N種不同面值的硬幣,每種硬幣有無(wú)限多個(gè)。為了方便購(gòu)物,你希望帶盡量少的硬幣,但要能組合出1到X之間的任意值。

輸入格式

第一行兩個(gè)數(shù)X、N,以下N個(gè)數(shù),表示每種硬幣的面值。

數(shù)據(jù)規(guī)模

對(duì)于30%的數(shù)據(jù),滿足N≤3,X≤20;
對(duì)于100%的數(shù)據(jù),滿足N≤10,X≤1000.

輸出格式

最少需要攜帶的硬幣個(gè)數(shù),如果無(wú)解輸出-1.

輸入樣例

20 4 1 2 5 10

輸出

5

題意:給定一定面值的錢(qián),讓你能湊夠1-X中的所有值得同時(shí),硬幣數(shù)最少

**

思路

**:假設(shè)現(xiàn)在的狀態(tài)是1~now中的最優(yōu)情況,若金額再向上遞增的話,會(huì)想到2now的級(jí)別的最優(yōu)情況,而又由于貪心的問(wèn)題,選擇的面值要盡量的大,如果什么也不選的話,那么會(huì)得到2now的最優(yōu)方案,當(dāng)然會(huì)先到中間會(huì)有一個(gè)較大的面額,到這個(gè)面額的時(shí)候只需要一張就行了,但是題目的要求是1到n中面額所有取值的最小,所以無(wú)關(guān)。當(dāng)時(shí)如果我們用一個(gè)稍微大一點(diǎn)的面額比如<=now+1,那么我們最大就可達(dá)到1到2now+1,比上一個(gè)多了一位,但是以此類推,如果我們選用<=now+2的面值,那么我們就會(huì)空出now+1的值,因此雖然我們得到了1到2now+2的面值,但是花的票數(shù)比原來(lái)多了一個(gè)1,所以不是最優(yōu)。

借用大佬的一個(gè)例子:

假如now = 8, 那么我就能取到1~8中得所有錢(qián),那么我下一次取的硬幣面值不能超過(guò)9;因?yàn)榧偃缥胰×藗€(gè)10,那么我無(wú)法湊9元的。而如果我取了個(gè)9, 那么因?yàn)槲仪懊婺苋〉?~8中的所有,那么我現(xiàn)在就能取到[1, 8] ∪ 9 ∪ [ (1 + 9) ,(8 + 9) 也就是 [1, 17]; 如果我取了個(gè)8, 那么只能湊夠[1, 16];顯而易見(jiàn)是取9更好;所以取不超過(guò)(當(dāng)前總面值數(shù) + 1)的最大值

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=15; int m,n; int a[maxn]; bool flag=0; int main(){cin>>m>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);if(a[1]==1) flag=1;if(flag==0) cout<<"-1"<<endl;else {int now=0,ans=0;while(now<m){for(int i=n;i>=1;i--){if(a[i]<=now+1) {now+=a[i];ans++;break;}}}cout<<ans<<endl; }return 0; } ``

總結(jié)

以上是生活随笔為你收集整理的P1658 购物的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。