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} ai1个数所表示,如果可以表示,那么 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 提高组货币系统

P5020 [NOIP2018 提高组] 货币系统

NOIP 2018 提高组 货币系统

牛客-[NOIP2018]货币系统——完全背包问题的贪心优化

2018 noip 提高组初赛参考答案

noip2010普及组复赛接水问题