分三种情况。

至少取一种 那可以直接取 或者从上一种情况来取.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. 单调队列应用--BZOJ 3831 Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec  Memory Limit: 128 MB Description In the Byteotian Lin ...

  2. Trie树-可持久化

    // Made by xiper // updata time : 2015 / 12 / 8 // test status: √ // 使用前调用初始化函数 init() 同时 root[0] = ...

  3. 实习小记-python中可哈希对象是个啥?what is hashable object in python?

    废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...

  4. ZooKeeper一二事 - 搭建ZooKeeper伪分布式及正式集群 提供集群服务

    集群真是好好玩,最近一段时间天天搞集群,redis缓存服务集群啦,solr搜索服务集群啦,,,巴拉巴拉 今天说说zookeeper,之前搭建了一个redis集群,用了6台机子,有些朋友电脑跑步起来,有 ...

  5. 转: java学习路线图

    http://www.java1234.com/javaxuexiluxiantu.html

  6. 关于eclipse入门开发c/c++文章推荐

    1. 关于编译说明. http://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/ 2. 关于快捷键与代码阅读 http://www.cn ...

  7. VSFTPD配置TLS/SSL

    今天在OSX上配置Coda2 + Xampp的时候,发现FTP老是不连接到服务器上面,导致每次更改了文件都需要使用scp命令上传到服务器.如果一个文件还好,文件和文件夹一多就得使用rp参数全部提交,再 ...

  8. Groovy Spock环境的安装

    听说spock是一个加强版的Junit,今天特地安装了,再把过程给大家分享一下. 首先说明,我的Java项目是用maven管理的. 我用的Eclipse是Kelper,开普勒. 要使用Spock之前, ...

  9. max_allowed_packet自动恢复

    https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html http://blog.chinaunix.net/uid-20304801 ...

  10. 七种css方式让一个容器水平垂直居中

    阅读目录 方法一:position加margin 方法二: diaplay:table-cell 方法三:position加 transform 方法四:flex;align-items: cente ...