HDU 3535 分组混合背包

http://acm.hdu.edu.cn/showproblem.php?pid=3535

题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件,2时随意,每项工作的描述是花费的时间和获得的快乐值,求在T时间内可获的最大快乐值。

memset放错位置了,折腾老半天。

分组混合背包,有的取一件或不取,有的随意,有的最少一个

分三种情况讨论

s==0 考虑前面取过时这次取或不取,前一组取过时这次取或不取

s==1 考虑前一组取过时这次取或不取

s==2 考虑前面取过时这次取或不取

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,t,m,s;
int time[105],happy[105],dp[105][105];
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int i,j,k;
    while(cin>>n>>t)
    {
        memset(dp,-1,sizeof(dp));
        memset(dp[0],0,sizeof(dp[0]));
        for(i=1;i<=n;i++)
        {
            scanf("%d %d",&m,&s);
            for(j=0;j<m;j++)
            {
                scanf("%d%d",&time[j],&happy[j]);
            }
            if(s==0)
            {
                for(k=0;k<m;k++)
                {
                    for(j=t;j>=time[k];j--)
                    {
                        if(dp[i][j-time[k]]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i][j-time[k]]+happy[k]);
                        if(dp[i-1][j-time[k]]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i-1][j-time[k]]+happy[k]);
                    }
                }
            }
            else if(s==1)
            {
                for(j=0;j<=t;j++)
                    dp[i][j]=dp[i-1][j];
                for(k=0;k<m;k++)
                {
                    for(j=t;j>=time[k];j--)
                    {
                        if(dp[i-1][j-time[k]]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i-1][j-time[k]]+happy[k]);
                    }
                }
            }
            else
            {
                for(j=0;j<=t;j++)
                    dp[i][j]=dp[i-1][j];
                for(k=0;k<m;k++)
                {
                    for(j=t;j>=time[k];j--)
                    {
                        if(dp[i][j-time[k]]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i][j-time[k]]+happy[k]);
                    }
                }
            }
        }
        printf("%d\n",dp[n][t]);
    }
    return 0;
}
时间: 2024-08-24 18:31:17

HDU 3535 分组混合背包的相关文章

hdu 3535 AreYouBusy 混合背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有三种任务,至少完成一个,至多完成一个,任意完成.现在给出k组任务,每组任务都属于三种任务的一种.每个任务都会消耗时间,获得幸福感.求时间T内的最大满足感. 三种背包的混合.还是考察对背包问题的理解.显然一维已经满足不了要求了,我们设d[k][j]代表第k组容量为j时获得的最大满足感. 可以明显比较出三种背包的区别.(任意取也就是01背包) 任意取,至少取一种的区别:只取一种的状态是否非

hdu 3535 分组背包

题意: 有n组工作,现在有T分钟时间去做一些工作.每组工作里有m个工作,并且类型为s,s类型可以为0,1,2,分别表示至少选择该组工作的一项,至多选择该工作的一项,不限制选择.每个工作有ci,gi两个属性,表示需要花费ci时间去完成该项工作,完成后将会获得gi的快乐值,现在求快乐值最大多少,如果不能完成工作,输出-1: 原题如下: AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java

HDU 3535 AreYouBusy (混合背包)

题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下,可以得到的最大的乐趣是多少,如果不能满足条件就输出-1 题解:二维01背包 dp[i][j]:前i组物品我们拥有j的价值时最大可获得的乐趣 0:我们需要先把dp[i]所有赋值为负无穷,这样就只能最少选一个才能改变负无穷 1:我们不需要:dp[i][j-ci]+gi(在此组中再选一个),这样就一定最

HDU 3033 分组背包

http://www.hgy413.com/1319.html 简介DeviceIoControl的三种通信方式 HDU 3033 分组背包,布布扣,bubuko.com

ZOJ 3164 Cookie Choice 分组背包 混合背包

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3181 题意: 就是混合背包加分组背包,有的物品是01背包,有的是多重背包,有的是完全背包,同时物品还有不超过8组的分组,如果在同一组则最多只能选一种.问能不能恰好地用掉D的容量,并且使所获价值最大. 分析: 开始的想法是多开一个下标,先把没有分组的做了,在0的下标,然后分组分别在组号的下标里按顺序处理,是什么背包就用什么做法,不过一直WA,对拍小数据大数据都没啥问题(可能随机

HDU 3535 AreYouBusy

分组背包 最多取一个的组,则对于该组来说,每一个状态只可能由前一组的状态过来,分不取和取两种 至少取一个,则没了不取的选择,即没有dp[i][j]=dp[i-1][j]的递推式 任意取,即01背包,取法包括由前一组不取或取一个,或由该组取一个 dp[i][j]表示前i组,消耗j时间所能取得的最大值 初值赋为-1,表示该状态不可达,对于dp[0],初值赋为0,即什么都没有的时候最大的快乐值为0 还有一个要注意的点c[k]可能为0,会影响到递推式的顺序 发现做这种混合背包的题非常有助于弄清楚各种背包

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

HDU 4501 多维背包

小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2261 Accepted Submission(s): 1018 Problem Description 春节将至,小明要去超市购置年货,于是小明去了自己经常去的都尚超市. 刚到超市,小明就发现超市门口聚集一堆人.用白云女士的话说就是:"那家伙,那场面,真是人山人海,锣

HDU 2955 Robberies (01背包)

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11297    Accepted Submission(s): 4190 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that