找人建网站,唐山网络运营推广,做现货黄金的金融网站,做平台网站#include bits/stdc.h // 包含标准库中的所有头文件
using namespace std;int main()
{int n,m,k; // 定义变量n#xff08;糖果包数#xff09;、m#xff08;口味数#xff09;、k#xff08;每包糖果的个数#xff09;cinnmk; // 输入…
#include bits/stdc.h // 包含标准库中的所有头文件
using namespace std;int main()
{int n,m,k; // 定义变量n糖果包数、m口味数、k每包糖果的个数cinnmk; // 输入n、m、k的值vectorintdp(1m1,100); // 定义动态规划数组dp初始值为100大小为2的(m1)次方vectorintv(1m1,0); // 定义糖果口味数组v初始值为0大小为2的(m1)次方for(int i0;in;i) // 遍历每一包糖果{int h0,p;for(int j1;jk;j) // 遍历每包糖果中的每个口味{cinp; // 输入口味编号p-1; // 将口味编号转换为数组索引从0开始hh|(1p); // 将该口味对应的位标记为1表示这个口味被买了}v[i]h; // 将当前糖果的口味情况存入糖果口味数组中dp[h]1; // 更新动态规划数组表示只需要一包糖果就能满足这种口味需求}for(int i0;i(1m);i) // 遍历所有可能的口味组合{for(int j0;jn;j) // 遍历每一包糖果{dp[i|v[j]]min(dp[i|v[j]],dp[i]1); // 更新动态规划数组尝试用当前口味组合i去购买第j包糖果更新最小糖果包数}}if(dp[(1m)-1]100) // 如果对应全口味的糖果包数为100表示无法满足所有口味cout-1; // 输出-1elsecoutdp[(1m)-1]; // 输出满足所有口味的最小糖果包数return 0; // 返回0表示程序正常结束
}思路分析 首先定义了两个数组dp数组用于存储达到某种口味组合所需的最小糖果包数v数组用于存储每包糖果的口味情况。 遍历每一包糖果对每包糖果中的每个口味进行标记使用位运算将口味转换为对应的位标记。 根据每包糖果的口味情况更新dp数组表示只需要一包糖果就能满足该口味需求。 遍历所有可能的口味组合尝试用当前口味组合去购买每一包糖果并更新最小糖果包数。 最后如果对应全口味的糖果包数为100表示无法满足所有口味输出-1否则输出满足所有口味的最小糖果包数。
注 dp数组dp[i] 表示达到口味组合 i 所需的最小糖果包数。这里口味组合指的是一个二进制数每一位表示对应口味是否被包含如果某一位为1则表示对应的口味被买了为0则表示没有买。例如如果有三种口味m3那么口味组合 5二进制 101表示第1种口味和第3种口味被买了第2种口味没有被买。初始时dp数组的值均为100表示无法达到对应的口味组合。 v数组v[i] 表示第 i 包糖果的口味情况。它也是一个二进制数每一位表示对应的口味是否在这包糖果里如果某一位为1则表示这个口味在这包糖果里为0则表示不在。同样以三种口味为例如果第 i 包糖果的口味组合为 6二进制 110则表示第2种口味和第3种口味在这包糖果里第1种口味不在。