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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1658 购物(贪心算法)

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1658 购物(贪心算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P1658 購物
提交 2.48k
通過 1.16k
時間限制 1.00s
內存限制 125.00MB
題目描述

你就要去購物了,現在你手上有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
題目鏈接:https://www.luogu.com.cn/problem/P1658
1.首先我們要判斷數組內是否存在1,因為面額1只有1可以組成,而且如果存在面值1的硬幣,是一定可以組成出1-x的面值。
2.每次盡量用最大面值硬幣組合,這樣子才可以組成出最小的攜帶數。因此用sort排序。
上樣例分析:

第一次取1:
reach=1;當前可以組成的面額值
第二次取2:1,2,3
觀察:3是利用1+2得出的,如果我們當前可以取到的面額為reach,那么我們再攜帶的一個硬幣a[i],1–reach+a[i]都是可以組合出來的,因為2可以和1–reach的面值任意組合都是可行的所以reach更新為reach+=a[i];reach為3
第三次取2:1,2,3,4,5
與上同理reach為5

#include<iostream> #include<cstdio> #include<algorithm> #define INF 0x3f3f3f3f #define ll long long #define speed(x) ios::sync_with_stdio(false), cin.tie(x), cout.tie(x) #define bug(x) cout << #x << " == " << x << '\n'; const ll int MAX_N = 5e5 + 5; using namespace std; const int Maxn=1005; int a[MAX_N]={0}; int main() {int n,x;cin>>x>>n;for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);if(a[1]!=1)//需要可以組合出1-x的面值,而面值1只有1本身可以組合,{cout<<-1<<'\n';//而且如果有面值1無論后面的面值是怎么樣的,都可以組合出1-x的面值例:1 1 1 1 1 .....return 0;}int reach=0;//可以組成的面額值int ans=0;while(reach<x){int i=n;for(;i>=1;i--)//盡量找最大的{if(a[i]<=reach+1)break;}//1~reach面額的錢都可以組成,所以只需要找最大面額的鈔票,//該鈔票可以和reach+1-a[i]的錢組成reach+1或者直接等于reach+1reach+=a[i];//a[i]可以和reach+1-a[i]組成reach+1,同理a[i]可以和reach+2-a[i](reach+2-a[i]<=reach即可)組成reach+2....ans++;//攜帶的鈔票增加1個;}printf("%d\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的P1658 购物(贪心算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。