P5020 [NOIP2018 提高组] 货币系统(完全背包 dp)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P5020 [NOIP2018 提高组] 货币系统(完全背包 dp)相关的知识,希望对你有一定的参考价值。
P5020 [NOIP2018 提高组] 货币系统
解题思路
将货币系统(n,a)看做集合 A ,货币系统(m,b)看做集合 B
B集合属于A集合
那就是一道完全背包了
求出A集合中有多少个 a i a_i ai可以被别的 a i a_i ai组成
那答案就是 n-去重复的 a i a_i ai个数
AC代码
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int T,n,ans,a[10005],f[1000005];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(f,0,sizeof(f));//初值
f[0]=1;
ans=0;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)//完全背包
{
if(f[a[i]]){ans++;continue;}//能否被组成
for(int j=a[i];j<=a[n];j++)
f[j]|=f[j-a[i]];
}
printf("%d\\n",n-ans);//答案
}
return 0;
}
谢谢
以上是关于P5020 [NOIP2018 提高组] 货币系统(完全背包 dp)的主要内容,如果未能解决你的问题,请参考以下文章