1. 程式人生 > >NOIP2018 Day1 T2 貨幣系統 - 結論 - dp

NOIP2018 Day1 T2 貨幣系統 - 結論 - dp

結論是答案是輸入數字的一個子集滿足任意一個數字都不能被別的數字表示出來。顯然這個子集大小是log的。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define gc getchar()
using namespace std;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=
(x<<1)+(x<<3)+(ch^'0');return x; } const int N=110,MX=30000;int a[N],c[MX]; int main() { for(int T=inn();T;T--) { int n=inn(),ans=0,mx=0;rep(i,1,n) a[i]=inn(),mx=max(mx,a[i]); memset(c,0,sizeof(int)*(mx+1)),sort(a+1,a+n+1),c[0]=1; rep(i,1,n) if(!c[a[i]]) { ans++;rep
(j,a[i],mx) c[j]|=c[j-a[i]]; } printf("%d\n",ans); } return 0; }