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)的主要内容,如果未能解决你的问题,请参考以下文章

P5020 [NOIP2018 提高组] 货币系统

luogu P5020ybtoj背包问题课堂过关DP例题2货币系统 & NOIP2018 提高组货币系统

NOIP 2018 提高组 货币系统

P5020 货币系统

P5020 货币系统

Luogu P5020 货币系统