算法提高之货币系统
-
核心思想:背包 + 贪心
- 贪心思路:将a从小到大排序,因为a数组中数如果能用之前的数线性表示则它一定没用
- 所以对每一个数 求其是否能用前i-1个数表示(背包求方案数)
- 如果不能被其他数表示 就加入到b数组
- 贪心思路:将a从小到大排序,因为a数组中数如果能用之前的数线性表示则它一定没用
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 110,M = 25010; int f[M]; int a[N]; int n,m,T; int main() { cin>>T; while(T--) { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; memset(f,0,sizeof f); //清空f sort(a,a+n); int m = a[n-1]; //找最大值 f[0] = 1; //求方案数 初始化 int res=0; for(int i=0;i<n;i++) { if(!f[a[i]]) res++; //不能被其他数线性表示 加入b数组 for(int j=a[i];j<=m;j++) f[j] += f[j-a[i]]; } cout<<res<<endl; } }