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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

牛客网【每日一题】5月27日题目精讲 货币系统

發(fā)布時間:2023/12/3 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网【每日一题】5月27日题目精讲 货币系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:

文章目錄

    • 題目描述
    • 題解:
    • 代碼:

題目描述

在網友的國度中共有n種不同面額的貨幣,第i種貨幣的面額為a[i],你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為n、面額數組為a[1…n]的貨幣系統(tǒng)記作(n,a)。
在一個完善的貨幣系統(tǒng)中,每一個非負整數的金額x 都應該可以被表示出,即對每一個非負整數x,都存在n個非負整數t[i] 滿足a[i] x
t[i] 的和為x。然而,在網友的國度中,貨幣系統(tǒng)可能是不完善的,即可能存在金額x不能被該貨幣系統(tǒng)表示出。例如在貨幣系統(tǒng)n=3,
a=[2,5,9]中,金額1,3就無法被表示出來。
兩個貨幣系統(tǒng)(n,a)和(m,b)是等價的,當且僅當對于任意非負整數x,它要么均可以被兩個貨幣系統(tǒng)表出,要么不能被其中任何一個表出。
現在網友們打算簡化一下貨幣系統(tǒng)。他們希望找到一個貨幣系統(tǒng)(m,b),滿足(m,b)
與原來的貨幣系統(tǒng)(n,a)等價,且m盡可能的小。他們希望你來協(xié)助完成這個艱巨的任務:找到最小的m。

輸入描述:

輸入的第一行包含一個整數T,表示數據組數。接下來按照如下格式分別給出T組數據。
每組數據的第一行包含一個正整數n。接下來一行包含n個由空格隔開的正整數a[i]。

輸出描述:

輸出文件共T行, 對于每組數據, 輸出一行一個正整數, 表示所有與(n, a)等價的貨幣系統(tǒng)(m, b)中, 最小的m。

示例1
輸入

2 4 3 19 10 6 5 11 29 13 19 17

輸出

2 5

說明
在第一組數據中,貨幣系統(tǒng)(2, [3,10])和給出的貨幣系統(tǒng)(n, a)等價,并可以驗證不存在m < 2的等價的貨幣系統(tǒng),因此答案為2。
在第二組數據中,可以驗證不存在m < n的等價的貨幣系統(tǒng),因此答案為5。
備注:
1 <= T <= 20, 1 <= n <= 100, 1 <= a[i] <= 25000

題解:

首先,傷感一分鐘,紀念我逝去的oi
我唯一參加過的一屆的noip,讓我永生難忘
我記得當時考完后,有人戲稱為大凱的疑惑
我們來看一下題,先知道什么是貨幣系統(tǒng):其實就是這幾種不同面值的錢任意組合出其他錢。
如果一個貨幣系統(tǒng)中有3,有6,那么6就可以省略,因為6可以由兩個3組成,這樣我們就可以得到一個最小貨幣系統(tǒng),這個貨幣系統(tǒng)是原來的子集,且里面每種面值都是獨一無二不可代替的,與原本的是等價關系
我們可以從最小面值開始(因為最小面值肯定無法代替),然后面值依次變大
這樣,題意就成了,給你一堆數,每個數可用無數次,問能組成多少數?
這不就是完全背包問題
我們先排序
然后對前i-1個貨幣進行完全背包,不能被取代的幣值也加入背包中,到最后看看有多少

f[i]表示當前這個數x之前的數能不能組成i,如果f[x]等于1,那么說明x可以刪了,刪掉即可;如果f[x]是0,那么x不能刪,就按完全背包的方式更新f數組。(官方題解引入)

代碼:

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=25002; int a[320]; bool f[maxn]; int tot=0; int n; int main() {int T;cin>>T;while(T--){tot=0;cin>>n;memset(a,0,sizeof(a));for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);memset(f,0,sizeof(f));f[0]=1;// cout<<f[0]<<endl;for(int i=1;i<=n;i++){if(!f[a[i]]){tot++;//如果這個貨幣獨一不二,不能被組成,則保留// printf("j=%d %d\n",a[i],f[a[i]]); }else continue;for(int j=a[i];j<=maxn;j++){if(f[j-a[i]])f[j]=1;else if(f[j])continue; //當前j能否被構造 // printf("j-a[i]=%d %d\n",j-a[i],f[i-a[i]]); // printf("j=%d %d\n",j,f[j]); }}cout<<tot<<endl;}return 0; }

總結

以上是生活随笔為你收集整理的牛客网【每日一题】5月27日题目精讲 货币系统的全部內容,希望文章能夠幫你解決所遇到的問題。

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