1. 程式人生 > >【洛谷P5020】貨幣系統

【洛谷P5020】貨幣系統

題目大意:給定 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;
}