[蓝桥杯 2019 省 A] 糖果 java实现
状态压缩动态规划
import java.text.*;
import java.util.*;
class Main
{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//n包糖果
int n=sc.nextInt();
//m种口味
int m=sc.nextInt();
//每包糖果有k个糖
int k=sc.nextInt();
//dp[i]的含义是对当前i状态最少可以用多少包糖果满足
int[] dp=new int[1<<m];
Arrays.fill(dp, -1);
//首先将每包糖果的口味记录下来
//bag数组记录
int[] bag=new int[n];
for (int i=0;i<n;i++)
{
for (int j=0;j<k;j++)
{
bag[i]|=1<<(sc.nextInt()-1);
}
//每包糖果的状态一定可以用一包糖满足
dp[bag[i]]=1;
}
//先遍历每包糖果
for (int i=0;i<n;i++)
{
//遍历每个状态
for (int j=0;j<dp.length;j++)
{
//j状态本身不可到达直接跳过
if (dp[j]==-1)
{
continue;
}
//j状态可到达,直接填新状态
else if (dp[j|bag[i]]==-1)
{
dp[j|bag[i]]=dp[j]+dp[bag[i]];
}
//新状态已可达,可能更新
else
{
dp[j|bag[i]]=Math.min(dp[j|bag[i]],dp[j]+dp[bag[i]]);
}
}
}
//每个糖果都选择的状态的数量,-1为不可达
System.out.println(dp[(1<<m)-1]);
}
}