Acwing 532. 货币系统

直觉上B集合是A集合的非空子集,也就是说可以从A中舍弃一些元素,这些元素能被其他元素表示
就转化成了多重背包问题
#include<bits/stdc++.h>
using namespace std;

#define fr first
#define se second

typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;

const int INF = 0X3f3f3f3f, N = 100 + 10, M = 2e5 + 10, MOD = 1e9 + 10;

int w[N];

void work() {
	int n;
	cin>>n;
	
	for(int i=1;i<=n;i++) cin>>w[i];
	
	sort(w+1,w+n+1);
	
	int res=0;
	
	vector<int> f(w[n]+1);
	f[0]=1;
	
	for(int i=1;i<=n;i++){
	    if(f[w[i]]) continue;
	   
	   // for(int j=1;j<i;j++)  1
	        for(int k=w[i];k<=w[n];k++)
	            f[k]+=f[k-w[i]];
	    
	    res++;
	}
	
	cout<<res<<endl;
}

signed main() {
    int test;
    cin>>test;
	
	while(test--){
	    work();
	}
	
	return 0;
}
posted @ 2022-06-26 17:12  xhy666  阅读(12)  评论(0)    收藏  举报