P5020-货币系统【背包】
正題
題目鏈接:https://www.luogu.com.cn/problem/P5020
題目大意
定義S(A)S(A)S(A)表示集合AAA內(nèi)的若干個(gè)數(shù)字和(可以重復(fù)使用)可以表示的集合
nnn個(gè)數(shù)的集合FFF,求一個(gè)最小的集合G?FG\subseteq FG?F且S(F)=S(G)S(F)=S(G)S(F)=S(G)。
解題思路
對(duì)于一個(gè)數(shù)字a∈Fa\in Fa∈F如果a∈S(F)a\in S(F)a∈S(F)那么顯然a?Ga\notin Ga∈/?G。
對(duì)于一個(gè)數(shù)字a?Fa\notin Fa∈/?F那么a?Ga\notin Ga∈/?G。因?yàn)槿绻?span id="ozvdkddzhkzd" class="katex--inline">a?S(F)a\notin S(F)a∈/?S(F)那么aaa一定不能在GGG,如果a∈S(F)a\in S(F)a∈S(F)且a?Fa\notin Fa∈/?F那么FFF中一定有更小的數(shù)能表示出aaa,而這些數(shù)也需要在S(G)S(G)S(G)中所以這個(gè)aaa是一定不需要選的。
所以背包即可,時(shí)間復(fù)雜度O(Tn?max{ai})O(Tn*max\{a_i\})O(Tn?max{ai?})
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int T,n,ans,a[110],f[30000]; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);ans=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,0,sizeof(f));sort(a+1,a+1+n);f[0]=1;for(int i=1;i<=n;i++){if(!f[a[i]])ans++;for(int j=a[i];j<=a[n];j++)f[j]|=f[j-a[i]];}printf("%d\n",ans);} }總結(jié)
以上是生活随笔為你收集整理的P5020-货币系统【背包】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tplogin路由器设置怎么弄tplog
- 下一篇: P3168-[CQOI2015]任务查询