洛谷 P8687 [蓝桥杯 2019 省 A] 糖果

题意

\(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;
            }
        }
    }
}
posted @ 2024-02-01 20:06  Telsif  阅读(51)  评论(0)    收藏  举报