分三种情况。

至少取一种 那可以直接取 或者从上一种情况来取.dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v,dp[i][k-a[j].c]+a[j].v);

至多取一种 只能从上一种情况来取 dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v);

任意取 dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v,dp[i][k-a[j].c]+a[j].v);

#include<stdio.h>
#include<string.h>
#define maxn 110
#define INF 99999999
int dp[maxn][maxn];
struct node
{
int v;
int c;
}a[maxn];
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,j,n,m,t,s,k;
while(scanf("%d%d",&n,&t)!=EOF)
{
memset(dp,,sizeof(dp));//初始化为0,保证dp[1][0]=0;
for(i=;i<=n;i++)
{
scanf("%d %d",&m,&s); for(j=;j<=m;j++)
scanf("%d%d",&a[j].c,&a[j].v); if(s==)//至少1
{
for(k=;k<=t;k++)//保证下一次选的时候一定选一个
dp[i][k]=-INF; for(j=;j<=m;j++)
{
for(k=t;k>=a[j].c;k--)
{
//下面的顺序不能调换 如果dp[i-1]在前面,有可能就更新了2次,v被加了2次。
//可以考虑一下
//直接选当前的 先更新自己,
dp[i][k]=max(dp[i][k],dp[i][k-a[j].c]+a[j].v);
//从前一种情况来选当前的
dp[i][k]=max(dp[i][k],dp[i-][k-a[j].c]+a[j].v);
}
}
}
else if(s==)//最多选一个 所以从前一种来考虑
{
for(k=;k<=t;k++)
dp[i][k]=dp[i-][k];
for(j=;j<=m;j++)
{
for(k=t;k>=a[j].c;k--)
{
dp[i][k]=max(dp[i][k],dp[i-][k-a[j].c]+a[j].v);
}
}
}
else if(s==)//任意
{
for(k=;k<=t;k++)
dp[i][k]=dp[i-][k];
for(j=;j<=m;j++)
{
for(k=t;k>=a[j].c;k--)
{
dp[i][k]=max(dp[i][k],dp[i][k-a[j].c]+a[j].v);
dp[i][k]=max(dp[i][k],dp[i-][k-a[j].c]+a[j].v);
}
}
}
}
dp[n][t]=max(dp[n][t],-);
printf("%d\n",dp[n][t]);
}
}

hdu3535 混合背包的更多相关文章

  1. HDU3535 AreYouBusy 混合背包

    题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...

  2. HDU 3535 AreYouBusy(混合背包)

    HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...

  3. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  4. HDU 3535 分组混合背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...

  5. Codevs 3269 混合背包(二进制优化)

    3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为V ...

  6. codevs 3269 混合背包(复习混合背包)

    传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #inclu ...

  7. [codevs3269]混合背包

    题目大意:一道混合背包模板. 解题思路:分三种情况讨论,01和完全没什么问题,多重背包需要把物品分成$\log W[i]$件,然后01即可,分成W[i]件01会TLE. 读优大法好! C++ Code ...

  8. CODE[VS] 3269 混合背包

    3269 混合背包  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 背包体积为V ,给出N ...

  9. POJ 1742 (单调队列优化多重背包+混合背包)

    (点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...

随机推荐

  1. 利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

    基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢 ...

  2. POJ 2318 TOYS【叉积+二分】

    今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...

  3. 深入理解maven及应用--转

    (一):生命周期和插件 在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最 ...

  4. MongoDB学习(四)客户端工具备份数据库

    在上一篇MongoDB学习(三)中讲解了如何在服务器端进行数据的导入导出与备份恢复,本篇介绍下如何利用客户端工具来进行远程服务器的数据备份到本地. 以客户端工具MongoVUE为例来进行讲解: 1.首 ...

  5. Springmvc返回JSON乱码问号

    @RequestMapping(value="/book/getBook.do", produces = "text/html;charset=UTF-8") ...

  6. ArcGis实现添加MultiLayerMarkerSymbol(多个符号叠加生成新的符号)

    , , );             pMarkerSymbol.Angle = ;             pMarkerSymbol.XOffset = ;;;;, , );            ...

  7. C# Thread.Join()用法的理解 转

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 比如 1using System; 2 3namespace TestThreadJoin 4{ 5 class P ...

  8. 13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问

    这篇文章要实现的功能是:在一个Action中,有些业务方法只能是post提交上来的才能执行,有些方法是只能get提交上来的才能执行. 比如上篇文章中的UserAction.java(代码如下) pac ...

  9. [Python] 利用commands模块执行Linux shell命令

    http://blog.csdn.net/dbanote/article/details/9414133 http://zhou123.blog.51cto.com/4355617/1312791

  10. [android界面]android中src和background区别——前景与背景

    ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...