用到至少选择一个,所以没有空间优化
分组背包问题:
常见的三种分组问题:
分成K组:
1、每组最多只能取一件物品
一维数组伪码:
for 0 to K  对每一组进行
    for W to 0   对每一个代价进行判断 ///1
     for all item i in group k        ///2 这行个互换好像也对
     dp[w]=max(dp[w],dp[w-c[i]]+v[i];   每个重量保证的只有一件物品来取最大值
2、每组随意取(为01背包问题)******摘抄网络**既然上面的顺序是限制每组最多取一个,那调换一下顺序即可,其实就是01背包。******
一维伪码:
for 0 t0 K
    for all item i in group k
      for W to 0
      dp[w]=max(dp[w],dp[w-c[i]]+v[i]);
3、每组至少取一个
没见过一维的伪代码
用二维:
dp[ki][j]表示当前组的一件物品不选
dp[ki-1][j-w[i]]+v[i] 表示这是在ki组选第一个
dp[ki][j-w[i]]+v[i] 表示在这个ki组中再次选一个
dp[ki][j](处理完后的值)=max(dp[ki][j],dp[ki-1][j-w[i]]+v[i],dp[ki][j-w[i]]+v[i]) max分开的时候要注意顺序 max(dp[ki][j],dp[ki-1][j-w[i]]+v[i])......
在初始化时是ki==0(没有组)这时是dp[0][j]=0 其余的是-inf ******解决一件物品都不取的问题

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define X 10005
#define inf 0x3f3f3f3f
using namespace std;
int main()
{int n,t;int m,s;cin>>n>>t;int dp[105][105];int  c[105],g[105];memset(dp,-inf,sizeof(dp));memset(dp[0],0,sizeof(dp[0]));for(int i=1;i<=n;++i)//k组{cin>>m>>s;for(int j=0;j<m;++j){scanf("%d%d",&c[j],&g[j]);}if(s==0){// for(int j=0;j<=t;++j)//  dp[i][j]=-1000000;for(int j=0;j<m;++j)for(int p=t;p>=c[j];--p){dp[i][p]=max(dp[i][p],dp[i][p-c[j]]+g[j]);dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);}}else if(s==1){for(int j=0;j<=t;++j){dp[i][j]=dp[i-1][j];//当前i个组继承前i-1个组}for(int j=0;j<m;++j){for(int p=t;p>=c[j];--p){dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);}}}else if(s==2){for(int j=0;j<=t;++j){dp[i][j]=dp[i-1][j];}for(int j=0;j<m;++j){for(int p=t;p>=c[j];--p){// dp[i][p]=max(dp[i][p],dp[i-1][p]);//不取dp[i][p]=max(dp[i][p],dp[i][p-c[j]]+g[j]);//多个//dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);//一个}}}}// if(dp[n][t]<0)//      cout<<-1<<endl;//  elsecout<<max(dp[n][t],-1)<<endl;return 0;
}

【分组背包问题 (HDU 3535 )】相关推荐

  1. 九大背包问题专题--分组背包问题

    6.分组背包问题 问题: 有N组物品和一个容量是V的背包. 第组物品有若干个,同一组内的物品最多只能选一个每件物品的体积是vij,价值是wij.其中i是组号,j是组内编号. 求解将哪些物品装入背包,可 ...

  2. 基础算法--背包问题(01背包问题、完全背包问题、多重背包问题、分组背包问题)

    文章目录 前言 01背包问题 完全背包问题 多重背包问题 分组背包问题 前言 背包问题:给我们 i 件物品,每件物品都有体积 vi 和权重 wi ,给我们限制条件,让我们选择在背包的容量内,物品达到权 ...

  3. 01背包问题,多重背包问题-分组背包问题-完全背包问题-总结-内含4种经典背包问题

    01背包问题: 例题:传送门 01背包问题的特点:背包容量有限,物品只有一个,具有确定的体积和价值,我们的目标就是在不超过背包最大体积的情况下装入价值尽可能大的物品,让我们输出最大总价值 对于背包问题 ...

  4. 487 金明的预算方案(分组背包问题扩展)

    1. 问题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超 ...

  5. [AcWing] 9. 分组背包问题(C++实现)分组背包问题模板题

    [AcWing] 9. 分组背包问题(C++实现)分组背包问题模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 ...

  6. hdu 3535 AreYouBusy 经典混合背包

    借此机会,整理一下背包中的某几类问题: 物品分组,每组至少选一个: 这个时候 写法1:看别人博客,这样写省去了某些麻烦问题 达不到的dp值为-INF dp[i][j]=max(dp[i][j],max ...

  7. HDU 3535 AreYouBusy

    分析转自:http://www.cnblogs.com/jackge/archive/2013/04/22/3036374.html 链接:http://acm.hdu.edu.cn/showprob ...

  8. 动规之-分组背包问题

    题目描述 自 01 背包问世之后,小 A 对此深感兴趣.一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少. ...

  9. acwing算法题--分组背包问题

    原文链接:https://www.acwing.com/problem/content/9/ #include <iostream>using namespace std;const in ...

最新文章

  1. 可持久化数据结构讲解
  2. mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询
  3. 霸主–统治和管理API的地方
  4. 2020年十大币预测_2020年十大商业智能工具
  5. Windows修改注册表按键映射
  6. 网络口协商_以太网端口协商原理
  7. 【图像配准】基于matlab SIFT图像配准【含Matlab源码 463期】
  8. Altium Designer 21 实例贴片0603封装的创建
  9. ORACLE常用工具介绍
  10. 【雅思大作文考官范文】——第十四篇:festivals essay
  11. python自动化操作网页(谷歌浏览器)
  12. HDU-6468 zyb的面试(模拟十叉树+dfs)
  13. 汽车喇叭语音芯片,警报音效ic选型
  14. 【阿里云】域名解析 Tomcat绑定域名
  15. HBuilder打包iOS教程
  16. 基于强化学习的五子棋算法设计-python代码完整实现
  17. 深剖程序环境与预处理机制
  18. 基于FPGA的双通道DDS信号发生器
  19. 女生被逼疯的日记(课余篇)
  20. 使用VB写一个简单的添加系统环境变量的软件以及实现一键格式化U盘

热门文章

  1. [读书] Computer Vision: Algorithms and Applications
  2. rosdep init和rosdep update出错处理
  3. git: git add --ignore-removal git add --all 区别
  4. Android5.1修改以太网MAC地址(SElinux)
  5. WINCE5.0+2443 camera中断不能进来的原因
  6. mvp关联activity生命周期_Rxjava+Retrofit统一异常处理与生命周期管理
  7. D3可视化:(1)初次见面,SVG与D3的魅力
  8. C#集合--Dictionary
  9. javascript的变量
  10. 分布式对象存储系统在openstack中的应用研究--Ceph(一)