题目:
题解:
如果一个货币不能由小于等于它的货币表示出,就是一个
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[25005];
int a[105];
int main(){
int _;
cin>>_;
while(_--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
int ans=0;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++){
if(!dp[a[i]])ans++;
for(int j=a[i];j<=a[n];j++) dp[j]+=dp[j-a[i]];
}
cout<<ans<<endl;
}
return 0;
}
题后反思:
这题的写法对比于普通的求确定的完全完全背包方案数由当前这个数向前找贡献,变为了当前这个数对后做贡献。