题意
有 \(m\) 种口味,每次 \(k\) 颗一袋出售,给你 \(n\) 包均为 \(k\) 颗的糖果,求最少买几袋可以吃到所有口味的糖果。
思路
-
暴力
对 \(n\) 包糖果做组合。如果找到其中一种包含了所有口味,将所有满足的方案取糖果包数最小即可。
时间复杂度 \(\mathcal{O(2^n)}\)。
-
正解
考虑状压 dp 优化,定义状态 \(dp_i\) 为得到组合 \(i\) 的最少糖果包数,即答案为 \(dp_{(1<<m)-1}\)。
往组合 \(i\) 中加入一包糖果,得到新的组合 \(j\),则从 \(i\) 到 \(j\) 需要包数 \(dp_i+1\)。若原来的 \(dp_j\) 本来就大于 \(dp_i+1\),说明找到了更优解法,更新 \(dp_j\) 即可。
代码
for(int i=0;i<=(1<<m)-1;i++){
if(dp[i]!=-1){
for(int j=0;j<n;j++){
if(dp[i|a[j]]==-1||dp[i|a[j]]>dp[i]+1){
dp[i|a[j]]=dp[i]+1;
}
}
}
}
标签:洛谷,组合,蓝桥,口味,P8687,糖果,包数,dp
From: https://www.cnblogs.com/Telsif/p/18002026