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;
}

猜你喜欢

转载自blog.csdn.net/Mys_C_K/article/details/84307616