NOIP 2018 提高组 货币系统
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP 2018 提高组 货币系统相关的知识,希望对你有一定的参考价值。
题目链接
我们需要知道几个结论:
- 任意的 b i b_i bi都可以被 a i a_i ai所表示
- 最优解的情况, b i b_i bi只能从a数组里面选择
所以只要判断 a i a_i ai是否能被前 a i − 1 a_{i-1} ai−1个数所表示,如果可以表示,那么 a i a_i ai就不能选择,如果不可以被表示出来,那么 a i a_i ai必须选择
#include<bits/stdc++.h>
using namespace std;
//typedef pair<int,int> pii;
const int N = 105,M=25005;
int a[N],f[M];
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
for(int i=1;i<=25000;i++) f[i]=0;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int m = a[n];//设置m为a数组中的最大值
f[0]=1;//初始值设置
int res = 0;
for(int i=1;i<=n;i++)
{
if(!f[a[i]]) res++; //不可以表示就选择,结果加一
for(int j=a[i];j<=m;j++)
{
f[j]|=f[j-a[i]];
}
}
cout<<res<<'\\n';
}
return 0;
}
以上是关于NOIP 2018 提高组 货币系统的主要内容,如果未能解决你的问题,请参考以下文章
luogu P5020ybtoj背包问题课堂过关DP例题2货币系统 & NOIP2018 提高组货币系统