P5020-货币系统【背包】
生活随笔
收集整理的這篇文章主要介紹了
P5020-货币系统【背包】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P5020
題目大意
定義S(A)S(A)S(A)表示集合AAA內的若干個數字和(可以重復使用)可以表示的集合
nnn個數的集合FFF,求一個最小的集合G?FG\subseteq FG?F且S(F)=S(G)S(F)=S(G)S(F)=S(G)。
解題思路
對于一個數字a∈Fa\in Fa∈F如果a∈S(F)a\in S(F)a∈S(F)那么顯然a?Ga\notin Ga∈/?G。
對于一個數字a?Fa\notin Fa∈/?F那么a?Ga\notin Ga∈/?G。因為如果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中一定有更小的數能表示出aaa,而這些數也需要在S(G)S(G)S(G)中所以這個aaa是一定不需要選的。
所以背包即可,時間復雜度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);} }總結
以上是生活随笔為你收集整理的P5020-货币系统【背包】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tplogin路由器设置怎么弄tplog
- 下一篇: P3168-[CQOI2015]任务查询