b_lq_糖果(預處理糖果的貢獻)
阿新 • • 發佈:2020-10-07
給定 N 包糖果(一包K個,有M種口味),請你計算小明最少買幾包,就可以品嚐到所有口味的糖果。
思路
對於每一袋糖果,我都可以要或不要:
- 要的話,需滿足:
f[nx]==-1 || f[nx]>f[i]+1
;(nx=i|ST[j],nx是選完第j包糖果後的狀態,i是原狀態,ST[j]是第j包糖果的貢獻,j∈[0,n)) - 不要可以直接省略
#include<bits/stdc++.h> using namespace std; int main() { std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m,k; cin>>n>>m>>k; //n包糖果,m種口味,每包k顆 int tot=1<<m, a[n], f[tot+5]; fill(f, f+tot+5, -1); f[0]=0; for (int i=0; i<n; i++) { int st=0; for (int j=0; j<k; j++) { int x; cin>>x; st|=(1<<(x-1)); } a[i]=st, f[st]=1; } for (int i=0; i<tot; i++) if (f[i]!=-1) for (int j=0; j<n; j++) { int st=a[j]; if (f[i|st]==-1 || f[i|st]>f[i]+1) //i|st 是新狀態 f[i|st]=f[i]+1; } cout<<f[tot-1]; return 0; }