首页 > 其他分享 >多重背包

多重背包

时间:2022-11-22 23:11:06浏览次数:63  
标签:多重 背包 val dat 方块 ufr dp 赋值

太空电梯

奶牛们要去太空了!它们打算用方块建造一座太空电梯。现在它们有 \(N\) 种方块,第 \(i\) 种方块有一个特定的高度 \(h_i\),一定的数量 \(c_i\)。为了防止宇宙射线破坏方块,第 \(i\) 种方块的任何部分不能超过高度 \(a_i\)。
请用这些方块堆出最高的太空电梯。

每件物品最多可以\(M\)次,求总价值最大。
\(m\)代表次数,\(j\)代表背包容量,\(val\)代表当前物品的价值

第一种写法

第二层\(for\)循环不能使用正序遍历,并且每个物品的次序遍历要放在第三层for循环。假如正序遍历,当\(j=10\)时,\(m=1 val=2\)的话,那么这一次便给\(dp[j-m*val](dp[10-2]=dp[8])\)赋值,当\(m=2,val=2,j=12\)时,又会给\(dp[8]\)再赋值一次。同理假如\(m\)的循环是第二层结果也是一样,会重复赋值

  ufr(i, 1, n)
      lfr(j, dat[i].a, dat[i].h) 
        for (int k = 1;j >= k * dat[i].h && k <= dat[i].c; ++k)
          dp[j] = max(dp[j], dp[j - k * dat[i].h] + k * dat[i].h);
  f.pt(*max_element(goto(dp, dat[n].a)));

第二种写法

对同一个物品对容量为\(w\)的背包赋值\(m\)次

  ufr(i, 1, n)
    ufr(k, 1, dat[i].c)
      lfr(j, dat[i].a, dat[i].h){
         dp[j] = max(dp[j], dp[j - dat[i].h] + dat[i].h);
      }
  f.pt(*max_element(goto(dp, dat[n].a)));

本题的第二种做法

如果第\(i\)件物品堆积,那么如果要保证最大值,那么一定是在第\(i-1\)的基础之上进行堆积,将第\(dp[j-k*val]\)能赋值的位置都设置为\(true\),那么第\(i\)件物品一定是在\(dp[j-k*val]\)基础之上操作

   ufr(i, 1, n) 
     lfr(j, dat[i - 1].a, 0) if (dp[j]) 
        for (int k = 1; k <= dat[i].c && j + k * dat[i].h <= dat[i].a; ++k)
          dp[j + k * dat[i].h] = true;
 lfr(i, dat[n].a, 0)if (dp[i]) f.pt(i).ln();

标签:多重,背包,val,dat,方块,ufr,dp,赋值
From: https://www.cnblogs.com/GuanStudy/p/16916845.html

相关文章

  • 树形背包 / 树形DP(牛客 - 蓝魔法师)
    一般的树形背包问题,往往与以下模板异曲同工。复杂度为\(O(n^3)\)voiddfs(intu){ sz[u]=1; for(autov:G[u]) { dfs(v);sz[u]+=sz[v]; for(intj=sz[......
  • 用户背包优化分析与总结
    用户背包拉取列表接口数量变更推送旧每次点击用户背包,都拉取列表,每次道具消耗,都删除道具列表缓存保证一致性。缺点,单个道具的变更,会影响到整个列表缓存的生命周期,在道具量比......
  • [转]背包问题的贪心求解
    题目有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。思路具有最优子结构性质和贪心选择性......
  • #yyds干货盘点# 动态规划专题:01背包
    1、简述:描述你有一个背包,最多能容纳的体积是V。现在有n个物品,第i个物品的体积为 ,价值为。(1)求这个背包至多能装多大价值的物品?(2)若背包恰好装满,求至多能装多大价值的物品?输......
  • [算法模板随笔] 背包Part 1 01背包
    最近在oiwiki上学感觉蛮快乐的,比啃大部头书感觉效率来得快很多今天来聊一下最经典的01背包问题吧.01背包大概就是这样一个问题:有N件物品和一个容量是V的背包......
  • 0-1背包问题小结
    使用二维数组的情况先直接上代码。#include<iostream>#include<vector>//bits/stdc++.h文件在实际开发中不要使用//在VScode中似乎已经限制了bits/c++.h的使用。//#......
  • 空类与多重继承占用空间大小
    虚继承涉及虚表(虚指针),所以sizeof(C)=81#include<iostream>2usingnamespacestd;34classA{};5classA2{};6classB:publicA7{};89class......
  • 树上背包(注意事项)
    第一维从大的开始枚举第二位从小的开始枚举也可以统计大小从而剪枝voiddfs(intnow){if(w2[now]>m)return;f[now][w2[now]]=v2[now];for(inti=h2[now......
  • HDU 2191:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (多重背包)
    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活TimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):2529......
  • 20221113_T2A_背包贪心
    题意Steve的城堡正在被大量的怪物袭击。共有\(n\)个怪物正在袭击城堡,第\(i\)个怪物的攻击力为\(a_i\),防御力为\(b_i\)。城内有\(m\)个怪物猎人,第\(j\)个怪物......