1. 程式人生 > 其它 >P5020 [NOIP2018 提高組] 貨幣系統 題解

P5020 [NOIP2018 提高組] 貨幣系統 題解

前情提示:會TLE,吸口氧可以過

先想到:對於一個系統,當且僅當前面的數湊得出來這個數

之後就像一個完全揹包了

Code:

#include<algorithm>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>
#include<chrono>
#include<random>
#include<unordered_map>
using namespace std;

#define ll long long
#define ull unsigned long long
#define rll register long long
#define ri register int
//#define int long long

const int N=110;
int T;
int n;
int a[N];
int f[30010];

inline ll read(){
    ll x=0,y=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
            y=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*y;
}

inline bool cmp(int x,int y){
    return x<y;
}

signed main(){
    T=read();
    //freopen("money.in","r",stdin);
    //freopen("money.ans","w",stdout);
    while(T--){
        int m=0;
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        n=read();
        for(ri i=1;i<=n;i++)
            a[i]=read();
        sort(a+1,a+n+1,cmp);
        for(ri i=1;i<=n;i++){
            memset(f,0,sizeof(f));
            for(ri j=1;j<i;j++)
                for(ri k=a[j];k<=a[i];k++)
            	    f[k]=max(f[k],f[k-a[j]]+a[j]);
            if(f[a[i]]!=a[i])
                m++;
        }
		printf("%d\n",m);
    }
    return 0;
}