题意:有n种货币,每一种货币面值为a[i],并且每种货币有无穷个,请问只需多少种货币可以达到和这n种货币一样的支付范围?
思路:多重dp,将a数组按升序排列,如果第i种货币的值可以被前i-1种货币组成,则该面值的货币可以不要,计算不能被组成的货币种类数即可。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000007 int a[2005], dp[30000]; int main() { int t; scanf("%d",&t); while(t--) { int n; memset(dp,0,sizeof(dp)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int z=0; sort(a+1,a+n+1); dp[0]=1; for(int i=1;i<=n;i++) { if(dp[a[i]]==1) { continue; } z++; for(int j=0;j<=25000;j++) { if(j>=a[i]) dp[j]=dp[j]|dp[j-a[i]]; } } cout << z << endl; } return 0; }