【洛谷P5020】貨幣系統
阿新 • • 發佈:2018-11-12
題目大意:給定 N 個數,求在這 N 個數中至少選出幾個數能表示出所有數字,輸出最少的個數。
題解:由於只有小的數字可以表示大的數字,因此首先需要對這 N 個數字進行從小到大排序。排序之後就變成一道不定個數的數字組合問題,即:完全揹包思想。遍歷每一個數字,若該數字不能由之前的數字表示出來,則將答案加一,並將這個數字能夠表示的數字進行記錄即可。
程式碼如下
#include <bits/stdc++.h> using namespace std; const int maxn=110; const int maxv=25010; int n,ans,a[maxn]; bool f[maxv]; void read_and_parse(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+n+1); } void solve(){ for(int i=1;i<=n;i++)if(!f[a[i]]){ ++ans,f[a[i]]=1; for(int j=a[i];j<=a[n];j++)f[j]|=f[j-a[i]]; } printf("%d\n",ans); } int main(){ int T;scanf("%d",&T); while(T--){ memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); ans=0; read_and_parse(); solve(); } return 0; }