1 solutions

  • 0
    @ 2024-11-15 10:41:47
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110,M=25010;
    int f[M];
    int v[N];
    int main()
    {
    	int z;
    	cin>>z;
    	while(z--)
        {
    		memset(f,0,sizeof f); //清空之前的状态 
    		memset(v,0,sizeof v);
    		int n;
    		cin>>n;
    		for(int i=1;i<=n;i++) //获取每种货币 
            {
                cin>>v[i];
            }
    		sort(v+1,v+1+n); //从小到大排序 
    		int V=v[n]; //最大的货币 
    		int res=0;
    		f[0]=1; //初始化 
    		for(int i=1;i<=n;i++)
            {
    			if(f[v[i]]) continue; //可以被凑出来 
    			res++; //选了当前种 
    			for(int j=v[i];j<=V;j++)  //枚举比当前货币大的所有货币 
                {
                    f[j]=max(f[j],f[j-v[i]]); //更新标记 
                }
    		}
    		cout<<res<<endl;
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    991
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    8
    Accepted
    5
    Uploaded By