当前位置: 首页 > 科技观察

动态规划:关于多背包你应该知道的!

时间:2023-03-18 01:55:30 科技观察

MultipleBackpacks关于MultipleBackpacks,我在力口上没有找到对应的话题,所以在这里简单介绍一下,让大家有个大概的了解。有N个物品,一个容量为V的背包,第i个物品最多有Mi个物品可用,每个物品占用的空间为Ci,值为Wi。找到哪些物品放入背包可以让这些物品消耗的空间之和不超过背包的容量,且数值之和最大。多个背包与01背包非常相似。为什么它们与01背包相似?每个项目最多有Mi件可用。摊开小米碎片其实是01背包的问题。例如:背包的最大重量是10。物品分别是:重量价值数量item01152item13203item24302背包可以携带的物品的最大价值是多少?151item13201item13201item13201item24301item24301没有区别,这就变成了01背包问题,每个item只用一次。这样实现多个背包的代码如下:voidtest_multi_pack(){vectorweight={1,3,4};vectorvalue={15,20,30};vectornums={2,3,2};intbagWeight=10;for(inti=0;i1){//nums[i]为1,保持others项展开weight.push_back(weight[i]);value.push_back(value[i]);nums[i]--;}}vectordp(bagWeight+1,0);for(inti=0;i=weight[i];j--){//遍历背包容量dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);}for(intj=0;j<=bagWeight;j++){cout<weight={1,3,4};vectorvalue={15,20,30};vectornums={2,3,2};intbagWeight=10;vectordp(bagWeight+1,0);for(inti=0;i=weight[i];j--){//遍历背包容量//上面是01背包,然后加上遍历数for(intk=1;k<=nums[i]&&(j-k*weight[i])>=0;k++){//遍历次数dp[j]=max(dp[j],dp[j-k*weight[i]]+k*value[i]);}}//打印dp数组for(intj=0;j<=bagWeight;j++){cout<